Как исправить list.contains (объект), не возвращая хорошую логическую переменную - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь составить список из некоторого массива, сгенерированного случайным образом, в пределах диапазона и с фиксированным размером. Проблема в том, что когда я хочу увидеть, есть ли массив в списке (list.contains (массив)), он не возвращает хорошую логическую переменную. Вот как выглядит этот код, и я не знаю, в чем проблема:

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} }, но выходное значение постоянно меняется ... Оно всегда удваивает одно или два из вышеуказанных значений, что заставило меня думать, что проблема должна быть в функции содержимого.

1 Ответ

1 голос
/ 07 апреля 2019

List.contains использует Object.equals для проверки на равенство, но массивы используют равенство ссылок, а не равенство содержимого. Так что .contains всегда будет возвращать false.

К сожалению, для массивов, на самом деле, есть только два варианта:

  • Перепишите логику contains самостоятельно, используя Arrays.equals.
  • Оберните массивы в новый объект вашего собственного создания и напишите его методы равенства соответствующим образом.
...