#java #list #arraylist #random #contains
#java #Список #arraylist #Случайный #содержит
Вопрос:
Я пытаюсь составить список с некоторым массивом, сгенерированным случайным образом, в пределах диапазона и с фиксированным размером. Проблема в том, что когда я хочу посмотреть, есть ли массив уже в списке (list.contains(array)), он не возвращает правильную логическую переменную. Вот как выглядит этот код, и я понятия не имею, в чем проблема:
List<int[]> list = new ArrayList<int[]>();
int[] v = new int[n];
int n = 2, val_max = 3;
while (list.size() != max) {
v = getRandomArray(n, 1, val_max);
if (list.contains(v) == false)
list.add(v);
}
Я ожидаю, что результат для этого будет { {1, 2} {2, 1} {1, 3} {3, 1} {2, 3} {3, 2} }
но результат продолжает меняться… Он всегда удваивает одно или два из приведенных выше значений, что заставило меня подумать, что проблема должна быть в функции contains.
Ответ №1:
List.contains
используется Object.equals
для проверки равенства, но массивы используют равенство ссылок, а не равенство содержимого. Поэтому .contains
всегда будет возвращать false.
К сожалению, конкретно для массивов действительно есть только два варианта:
- Перепишите логику
contains
самостоятельно, используяArrays.equals
. - Оберните массивы в новый объект вашего собственного создания и соответствующим образом напишите его методы равенства.
Комментарии:
1. for (int i = 0; i < list.size(); i ) { if (Arrays.equals(list.get(i), v) == true) возвращает true; } возвращает false; Я пробовал это в функции contains_list, но все равно это не работает
2. Третий вариант: используйте
TreeSet
с явным компаратором, который сравниваетint[]
s лексикографически. (Конечно, это не сохранило бы порядок вставки).3. Еще один вариант: оберните каждый массив в IntBuffer . У этого класса есть
equals
метод, основанный на значениях элементов массива.