2016-04-14 13 views
1
import java.util.Random; 
import java.util.ArrayList; 
public class Game { 
ArrayList<Integer> numere = new ArrayList<>(); 
ArrayList<Bila> balls = new ArrayList<Bila>(); 
ArrayList<String> culori = new ArrayList<>(); 
Random random = new Random(); 
int nrBalls=0; 
public void createColours(){ 
    for(int i=0;i<7;i++){ 
     culori.add("Portocaliu"); 
     culori.add("Rosu"); 
     culori.add("Albastru"); 
     culori.add("Verde"); 
     culori.add("Negru"); 
     culori.add("Galben"); 
     culori.add("Violet"); 
    } 
} 
public void createNumbers(){ 
    for(int i=1;i<50;i++){ 
     numere.add(i); 
     System.out.print(numere.size()); 
    } 
} 
public void createBalls(){ 
    while(nrBalls<36){ 
     int nr =numere.get(random.nextInt(numere.size())); 
     numere.remove(nr); 
     String culoare =culori.get(random.nextInt(culori.size()-1)); 
     culori.remove(culoare); 
     balls.add(new Bila(culoare,nr)); 
     nrBalls++; 
    } 
} 
} 

ich eine andere Klasse mit Hauptverfahren haben zu entfernen und in dieser Klasse i createNumbers() aufrufen, createColours(), createBalls(). Wenn ich das Programm laufen bekomme ich eine IndexOutOfBoundsException bei numere.remove (nr) sprich index: eine nummer und größe: eine andere nummer ..immer ist die zweite nummer kleiner als die erste nummer..Warum passiert das? wo liege ich falsch?ganze Zahl von Arraylist IndexOutOfBoundsException So

Antwort

1

Das Problem besteht darin, dass ArrayList.remove() zwei Methoden hat, eine, die ein Objekt ist, und eine, die ein (Int-Index) ist. Wenn Sie die .remove-Anweisung mit einer Ganzzahl aufrufen, ruft sie die .remove(int) auf, die den Index und nicht den Objektwert entfernt.

Als Antwort auf einen Kommentar, hier ist ein bisschen mehr Informationen.

Die Zeile int nr = numere.get(random.nextInt(numere.size()) gibt den Wert des Objekts an dem vom Aufruf zurückgegebenen Index zurück. Die nächste Zeile numere.remove(...) versucht, den Wert aus der ArrayList zu entfernen.

Sie können eine von zwei Möglichkeiten:

int idx = random.nextInt(numere.size()); 
int nr = numere.get(idx); 
numere.remove(idx); 

Die .remove(int) Methode gibt den Wert des Entfernen des Objekts, können Sie auch tun:

int idx = random.nextInt(numere.size()); 
int nr = numere.remove(idx); 

Natürlich können diejenigen konsolidieren zwei Zeilen zu einem einzigen, falls gewünscht.

+0

Ja, ich möchte es die Nummer in meiner Arraylist an dieser Position –

+0

@BaiRadule entfernen, eine aktualisierte Antwort mit ein bisschen mehr Erklärung zur Verfügung gestellt. Im Wesentlichen nahm der ursprüngliche Code den ** -Wert ** vom Array und versuchte dann, den ** Wert ** aus dem Index zu entfernen, und nicht den Indexstandort. – KevinO

+0

danke Mann, das ist die Antwort, die ich suchte –

1

numere - Array enthält nur intergers 1 bis 49.

numere.remove (nr); - hier kann nr eine beliebige Zahl im Bereich der ganzen Zahl sein. Weil es durch zufällige Funktion erstellt wurde. Es wirft also einen Fehler auf. Sie können nur die Elemente entfernen, die sich in der Arraylist befinden. sonst Programm wird eine Ausnahme werfen

0

Die remove(int) wird das Element am angegebenen Index, nicht das Element gleich dem angegebenen Wert entfernen. Und auch gibt es das entfernte Element, so können Sie einfach tun:

int nr = numere.remove(random.nextInt(numere.size())); 

Sie können für Ihre culoare das gleiche tun:

String culoare = culori.remove(random.nextInt(culori.size())); 

nur etwas dagegen, dass Random.nextInt(int) eine Exception aus, wenn das Argument Null ist (wenn Ihre Liste leer ist).

+0

ja, aber wenn die Zufallszahl für ex 32 als der Index auf die Zahl 32 in meinem Array wird 31 sein, also wenn ich Numere.size() - 1 wird die entfernen genaue Nummer, die ich will..aber es gibt mir immer noch den gleichen Fehler –

+0

meine Liste wird nicht leer sein, weil nur 35 Nummern ..und mein Array hat 49 –