Android: ошибка java.lang.Исключение IndexOutOfBoundsException недопустимое местоположение

#java #android

#java #Android

Вопрос:

У меня есть этот метод ниже, который генерирует случайное число на основе размера моих записей JSON, и каждое число может прийти только один раз. Я использовал метод 3 раза, потому что мне нужно сгенерировать 3 случайных числа, которые должны отличаться друг от друга.

Иногда это работает, но иногда это выдает мне эту ошибку в logcat: Ошибка java.lang.Исключение IndexOutOfBoundsException недопустимое местоположение, и это приводит к сбою моего приложения.

Кто-нибудь может помочь мне решить мою проблему? Спасибо!

           int max = prjcts.size();
          List<Integer> indices = new ArrayList<Integer>(max);
          for(int c = 1; c < max;   c)
          {
              indices.add(c);
          }

          int arrIndex = (int)((double)indices.size() * Math.random());
          int randomIndex1 = indices.get(arrIndex);
          indices.remove(arrIndex);


          int randomIndex2 = indices.get(arrIndex);
          indices.remove(arrIndex);


          int randomIndex3 = indices.get(arrIndex);
          indices.remove(arrIndex);
  

@KPBird:
Итак, я меняю свой код так, как вы мне сказали, но он по-прежнему выдает мне ошибки каждый раз:
Я что-то упускаю?

 Random r = new Random();
  int arrIndex = r.nextInt(indices.size());
  int randomIndex1 = indices.get(arrIndex);
  indices.remove(arrIndex);


  int randomIndex2 = indices.get(arrIndex);
  indices.remove(arrIndex);


  int randomIndex3 = indices.get(arrIndex);
  indices.remove(arrIndex);
  

Ответ №1:

Проблема в том, что indices.remove(...) удаляет запись из списка и уменьшает размер списка на 1 при каждом его вызове. Другая проблема, похоже, заключается в том, что вы пытаетесь получить один и тот же индекс массива для каждого randomIndexX , что на самом деле не имеет никакого смысла.

Редактировать: Завершите пример, основанный на моем комментарии ниже. При этом выводятся числа от 1 до N (включительно) в случайном порядке.

 import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class RandomX {  

  public static void main(String[] args) {
    int start = 1;
    int n = 10;
    List<Integer> numbers = new ArrayList<Integer>();

    for (int i = start; i <= n; i  ) {
      numbers.add(i);
    }

    Collections.shuffle(numbers);

    for (int i = 0; i < n; i  ) {
      System.out.println(numbers.get(i));
    }
  }

}
  

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

1. поэтому для меня лучше создать arrIndex2,arrIndex3 и удалять их при каждом вызове метода. Я прав?

2. Просто поместите числа в индексы, вызовите Collections.shuffle (индексы), а затем возьмите первые X чисел. Shuffle рандомизирует их для вас.

Ответ №2:

indices.size() * Math.random() возможно, может вернуть размер списка. Что на единицу больше, чем последний индекс.

Поэтому вы должны использовать indices.size() - 1 в качестве максимального значения.