Как исправить list.contains(объект), не возвращающий правильную логическую переменную

#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 метод, основанный на значениях элементов массива.