2017-06-21 5 views
0

Je veux que le programme suivant prenne l'entrée de l'utilisateur, stockez-le dans le tableau puis répétez-le lorsque l'utilisateur tape stop.Je ne peux pas supprimer les valeurs nulles de la sortie du tableau

Cependant, il imprime le reste des valeurs jusqu'à 100 comme null, c'est ce que je dois supprimer. J'ai essayé quelques méthodes différentes mais ça ne marche pas pour moi.

C'est essentiellement ce que j'ai jusqu'à présent (avec l'aide d'autres questions sur Stack):

public static void main(String[] args) { 

    String[] teams = new String[100]; 
    String str = null; 
    Scanner sc = new Scanner(System.in); 
    int count = -1; 
    String[] refinedArray = new String[teams.length]; 

    for (int i = 0; i < 100; i++) {  
     str= sc.nextLine(); 


     for(String s : teams) { 
      if(s != null) { // Skips over null values. Add "|| "".equals(s)" if you want to exclude empty strings 
       refinedArray[++count] = s; // Increments count and sets a value in the refined array 
      } 
     } 

     if(str.equals("stop")) { 
      Arrays.stream(teams).forEach(System.out::println); 
     } 

     teams[i] = str; 
    } 
} 
+0

Peut-être que vous pouvez convertir les équipes à une liste, puis tronquer comme il est dit à https://stackoverflow.com/questions/1279476/truncate-a-list-to -a-given-number-of-elements – ZeldaZach

+0

@ZeldaZach il n'est pas nécessaire de tronquer une 'List' dans ce cas. Il ne contiendra que les éléments qui ont été ajoutés. –

Répondre

1

Matrice a une taille fixe et si vous utilisez un tableau d'une toute classe, vous aura une valeur nulle pour les index des valeurs non valorisées.

Si vous voulez avoir un tableau avec uniquement des valeurs utilisées, vous pouvez définir une variable pour stocker la taille réellement utilisée par array.
Et utilisez-le pour créer un nouveau tableau avec la taille réelle.

Dans le cas contraire, vous pouvez utiliser la matrice d'origine mais ne itérez que jusqu'à la taille réelle de la matrice lorsque vous bouclez .

String[] teams = new String[100]; 
int actualSize = 0; 
... 
for (int i = 0; i < 100; i++) {  
    ... 

    teams[i] = str; 
    actualSize++; 
    ... 
} 
    ... 
String[] actualTeams = new String[actualSize]; 
System.arraycopy(array, 0, actualTeams, 0, actualSize); 

Une meilleure solution est bien sûr en utilisant une structure qui ajuste automatiquement sa taille, tel qu'un ArrayList.

1

Vous avez juste besoin de dire à votre flux quels éléments inclure. Vous pouvez modifier la ligne construction du flux:

if(str.equals("stop")) { 
     //stream is called with a beginning and an end indexes. 
     Arrays.stream(teams, 0, i).forEach(System.out::println); 
    }