2015-12-04 2 views
2
import java.util.ArrayList; 
import java.util.Random; 

public static void main(String[] args) { 
    ArrayList<Integer> random = new ArrayList<Integer>(); 
    random = getRandom(100, 100); 
    for (int i = 0; i < random.size(); i++) 
     System.out.println(random.get(i)); 
} 

private static ArrayList<Integer> getRandom(int range, int size) { 
    ArrayList<Integer> randomNumbers = new ArrayList<Integer>(); 
    for (int i = 0; i < size; i++) 
     randomNumbers.set(i, new Random().nextInt(range)+1); 
    return randomNumbers; 
} 

Всякий раз, когда я запускаю это, я получаю исключение в потоке «основной» java.lang.IndexOutOfBoundsException: Индекс: 0, Размер: 0Как создать метод, который генерирует ArrayList случайного числа

+0

Первоначально, когда вы объявляете список массива , массив заднего конца пуст. Итак, когда вы вызываете add() только первый элемент, тогда создается массив размера по умолчанию. И, поскольку вы используете set(), это означает, что вы пытаетесь установить значение в индексе в пустом массиве. –

+0

Таким образом, вы можете заменить set() на add(). –

+0

Не нужно создавать этот объект ArrayList в Main, потому что вы возвращаете его из своего метода и назначаете его этой переменной, которая «перезаписывает» предыдущее значение. – null

ответ

3

Изменить

randomNumbers.set(i, new Random().nextInt(range)+1); 

в

randomNumbers.add(new Random().nextInt(range)+1); 

set() метод из ArrayList работает в EXISTING элемента ArrayList, но в вашем случае это пустого, что означает, что первый вызов

randomNumbers.set(i, new Random().nextInt(range)+1); 

где i == 0 является недействительным. Вместо этого используйте add().

0

Arraylist подкрепляется arrays, при использовании метода set с index, он пытается установить значение в index после скопированного array пусто Вы получаете IndexOutOfBoundsException, поэтому сначала вам нужно заполнить Arraylist.

Для этого вам нужно использовать метод add вместо set

0

В дополнение к JDev's correct response above, посмотрите на описание ArrayList#set «s Javadoc:

Заменяет элемент в указанное позицию в этом списке с указанным элементом.

Таким образом, указанный индекс должен быть заполнен для того, чтобы вызов ArrayList#set был успешным.

0
arrayList.set(index, value) method is used to replace old value with new value. But in your case, you are not replacing a value. You are just simply adding values. 
So, Use add method of list. 



randomNumbers.add(new Random().nextInt(range)+1); 

And for printing the values of Arraylist, you are using: 

for (int i = 0; i < random.size(); i++) 
     System.out.println(random.get(i)); 

but no need to iterate it through for loop, You can directly print this like below: 

System.out.println(random); 
0

Если вы хотите, вы можете также использовать функциональный стиль:

List<Integer> list = IntStream.range(0, 100) 
    .mapToObj(i -> random.nextInt(100)) 
    .collect(Collectors.toList()); 

Это будет minimize the moving parts, которые являются частью того, что вызывает у вас проблемы :)

+1

Это излишне сложно. Просто используйте 'random.ints (100, 0, 100) .boxed(). Collect (Collectors.toList())' – Holger

+0

Прохладный! Я не знал о 'boxed()' – uzilan

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