2016-04-14 4 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++; 
    } 
} 
} 

Так у меня есть еще один класс с основным методом и в этом классе я называю createNumbers(), createColours(), createBalls(). При запуске программы я получаю IndexOutOfBoundsException на numere.remove (nr), говорящий индекс: число и размер: другой номер .. всегда второе число меньше первого числа. Почему это происходит? Где я ошибаюсь?удаление целого числа от ArrayList IndexOutOfBoundsException

ответ

1

Проблема заключается в том, что ArrayList.remove() имеет два метода: объект, который является объектом, и тот, который является (индексом int). Когда вы вызываете .remove с целым числом, он вызывает .remove(int), который удаляет индекс, а не значение объекта.

В ответ на комментарий здесь немного больше информации.

Линия int nr = numere.get(random.nextInt(numere.size()) возвращает значение объекта объекта по индексу, возвращаемому вызовом. Следующая строка numere.remove(...) пытается удалить из значения ArrayList значение.

Вы можете сделать один из двух способов:

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

Метод .remove(int) возвращает значение Вытащите объекта, вы также можете сделать:

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

Конечно, вы можете объединить тех, при необходимости, две строки в одну.

+0

да, я хочу, чтобы он удалил число в моем архаристе в этой позиции –

+0

@BaiRadule, предоставил обновленный ответ с немного более подробным объяснением. По сути, исходный код взял ** значение ** из массива, а затем попытался удалить из индекса, что ** значение **, а не местоположение индекса. – KevinO

+0

спасибо, человек, это ответ, который я искал –

1

numere - ArrayList содержит только intergers от 1 до 49.

numere.remove (NR); - здесь nr может быть любым числом в диапазоне целых чисел. Потому что он был создан случайной функцией. Так что это ошибка. вы можете удалить только элементы, находящиеся в arraylist. иначе программа выдаст исключение

0

remove(int) удалит элемент по указанному индексу, а не по элементу, равному заданному значению. А также возвращает удаленный элемент, так что вы можете просто сделать:

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

Вы можете сделать то же самое для culoare:

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

Просто в голову, что Random.nextInt(int) будет сгенерировано исключение, если аргумент равен нулю (если ваш список пуст).

+0

да, но если случайное число для ex 32, чем индекс для числа 32 в моем массиве будет 31, поэтому, если я ставлю numere.size() - 1, вы удалите точный номер я хочу .. но он все равно дает мне ту же ошибку –

+0

мой список не будет пустым, потому что принимает только 35 номеров ..и мой массив имеет 49 –

Смежные вопросы