2017-03-26 3 views
-2

Ich habe eine ArrayList, mit etwa 80 Objekten, versuche ich zufällig eines der Objekte auszuwählen, es einem anderen Objekt zuzuweisen, es aus der Array-Liste zu entfernen und dann das ausgewählte Objekt zurückzugeben. Stattdessen gebe ich Objekte zurück, die bereits entfernt wurden.Warum wählt meine Array-Liste Elemente aus, die entfernt wurden?

hier ist mein Code:

while (!ballStorage.isEmpty()) { 
    SecureRandom rnd = new SecureRandom(); 

    int arraySize = ballStorage.size();//this is 80 
    for (int j = 80; j >= 0; j--) { 
     while (arraySize > 0) { 

      int i = rnd.nextInt(arraySize); 

      ballSelected = ballStorage.get(i); 
      ballStorage.remove(i); 
      ballStorage.trimToSize(); 
      arraySize--; 

      //debugging println's 
      System.out.print(ballStorage); 
      System.out.println("random number generated is: " + i); 
      System.out.println("ball selected is: " +ballSelected); 
      System.out.println("Array size is: " + arraySize); 

      return ballSelected; 
     } 

    } 
} 
return ballSelected; 

//output:45W,[62Bl,, 74Bl,]random number generated is: 2 
    ball selected is: 16W, 
    Array size is: 2 
    16W,[62Bl,]random number generated is: 1 
    ball selected is: 74Bl, 
    Array size is: 1 
    74Bl,[]random number generated is: 0 
    ball selected is: 62Bl, 
    Array size is: 0 
+0

Sie aus dem Inneren einer Schleife (ohne Bedingung Prüfung) zurückkehrt, sind Sie sicher? Ihre while-Schleife wird niemals mehr als einmal ausgeführt. Auch while (size> 0) {if (size == 0) 'ist redundant, weil die if-Bedingung niemals wahr sein wird. – Moira

+1

Das wird den gleichen Eintrag nicht zweimal auswählen. Es könnte scheinen, wenn die ArrayList Duplikate enthält. Aber es gibt eine Reihe von Problemen mit dem Code. Sie machen zwei Schleifen, kehren aber von der ersten Iteration von beiden zurück und machen beide beide sinnlos. Sie haben eine Schleifenbedingung ('while (arraySize> 0)', wobei die erste Anweisung innerhalb des Körpers nach einer unmöglichen Bedingung sucht ('if (arraySize == 0)'; aber Sie wissen, dass es nicht 0 ist, es ist> 0) die 'while' wäre zu Ende). Wir können Ihnen nicht sagen, was an diesem Code-Bruchteil falsch ist. Wir brauchen einen [mcve]. –

Antwort

0
while (!ballStorage.isEmpty()) { 

     SecureRandom rnd = new SecureRandom(); 


     int i = rnd.nextInt(ballStorage.size()); 

     ballSelected = ballStorage.get(i); 
     ballStorage.remove(i); 
     ballStorage.trimToSize(); 





     System.out.print(ballStorage); 
     System.out.println("random number generated is: " + i); 
     System.out.println("ball selected is: " +ballSelected); 
     System.out.println("Array size is: " + arraySize); 

    } 


    return ballSelected; 

Ich kann nicht verstehen, warum Sie in einer Schleife zurück. Dies ist der Grund, warum Ihre Schleife einmal ausgeführt wird.

Aber ich nehme an, Sie wollen die BallSelected jedes Mal zurück so:

class BallStorage implements Iterator<Ball>, Iterable<Ball> { 

    private int size; 
    private Random random; 
    private ArrayList<Ball> balls; 


    public BallStorage() { 
     this.size = 0; 
     this.balls = new ArrayList<>(); 
     this.random = new Random(); 
    } 

    public void add(Ball ball) { 
     this.size++; 
     balls.add(ball); 
    } 

    Ball next() { 

     Ball b = balls.get(random.nextInt(size)); 
     balls.remove(b); 
     this.size--; 
    return b; 
    } 

    boolean hasNext() { 
     return size > 0; 
    } 

    Iterator<Ball> iterator() { 
     return this; 
    } 

    public static void main(String[] args) { 
     //Create Balls and add them in ballStorage object 

     for(Ball ball: ballStorage) 
      System.out.println("ball selected is: " +ball); 
    } 

} 
+0

Ich muss den Ball jedes Mal zurückgeben, wenn ich das Array kürze, habe ich versucht es mit einer if-Anweisung aber die Arraylist kehrt auf die ursprüngliche Größe zurück. Danke für die Eingabe, die geholfen hat! –

+0

Ich habe den Code bearbeitet – tasosxak

Verwandte Themen