проблема с генерацией случайных чисел

#java #android #arraylist #indexoutofboundsexception

#java #Android #arraylist #исключение indexoutofboundsexception

Вопрос:

 ArrayList <String> fil = new ArrayList<String>(); 
ArrayList <String> lif = new ArrayList<String>();

int x=0;
long tim = System.currentTimeMillis(); 
Random random = new Random(tim); 
for(int i=0;i<fil.size();i  )
{
 x =random.nextInt(fil.size());
         for(int y=0;y<lif.size();y  )
         {
             if(fil.get(x).equals(lif.get(y)))
             {
                 i--;
                 continue;
             }
         }
         System.out.println("Set the value of x" x);
          lif.add(i, fil.get(x));//array index out of bound exception


     }
  

Я пытаюсь скопировать содержимое ArrayList fil в lif в другом порядке, но я получаю ArrayIndexOutOfBoundException в прокомментированной строке. Я использую вложенный цикл for, чтобы проверить, уникальны ли элементы нового ArrayList.

Комментарии:

1. Всем большое спасибо 🙂 Я использовал метод Collections.shuffle и он великолепен 🙂

Ответ №1:

Почему бы вам не попробовать методы Collections.copy и Collections.shuffle.

Ответ №2:

Не является ли Collections.shuffle лучшей альтернативой?

Ответ №3:

«lif»-ArrayList должен быть предварительно выделен для хранения элементов «fil.size()» перед перетасовкой содержимого. Попробуйте добавить нулевые элементы «fil.size()» перед входом в цикл for.

Внимание! Это очень неэффективный подход к выполнению перетасовки, см. Collections.reshuffle() для лучшего подхода.

Ответ №4:

 if(fil.get(x).equals(lif.get(y)))
{
    i--;
    continue;
}
  

Одна из возможных проблем заключается в том, что ‘i’ равно 0 (нулю). Уменьшение i-- установит ‘i’ равным -1, что вызовет исключение с… lif.add(i, fil.get(x));

Возможно, это не ответ, но вы должны проверять, что i, x и y находятся в пределах объектов ArrayList.

Ответ №5:

Измените прокомментированную строку на:

 lif.add(fil.get(x));
  

Это должно исправить исключение. Однако ваш алгоритм выглядит не очень хорошо.

Ответ №6:

Измените код на этот и проверьте, работает ли это

 x =random.nextInt(fil.size() - 1);
  

Комментарии:

1. Из документации nextInt (int n): Возвращает псевдослучайное, равномерно распределенное значение int между 0 (включительно) и указанным значением (исключительным), полученное из последовательности этого генератора случайных чисел.