#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
в качестве максимального значения.