Использование содержит в ArrayList с целочисленными массивами - PullRequest
12 голосов
/ 31 января 2011

У меня есть ArrayList<int[]>, и я добавляю к нему массив.

ArrayList<int[]> j = new ArrayList<int[]>();
int[] w = {1,2};
j.add(w);

Предположим, я хочу знать, содержит ли j массив, содержащий {1,2}, без использования w, так как я буду звонить из другого класса.Итак, я создаю новый массив с {1,2} в нем ...

int[] t = {1,2};
return j.contains(t);

... но это вернет false, даже если w был добавлен в список, а w содержитточно такой же массив, что и t.

Есть ли способ использовать содержащий так, что я могу просто проверить, имеет ли один из элементов ArrayList значение массива {1,2}?

Ответы [ 7 ]

9 голосов
/ 31 января 2011

Массивы можно сравнивать только с Arrays.equals ().

Возможно, вам нужен ArrayList из ArrayLists.

ArrayList<ArrayList<Integer>> j = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> w = new ArrayList<Integer>();
w.add(1); w.add(2);
j.add(w);
ArrayList<Integer> t = new ArrayList<Integer>();
t.add(1); t.add(2);
return j.contains(t); // should return true.
8 голосов
/ 31 января 2011

Проблема здесь в том, что массивы не переопределяют Object.equals(Object), поэтому сравнение между двумя записями списка происходит с реализацией equals () по умолчанию

// from Object.class
public boolean equals(Object obj) {
return (this == obj);
}

Таким образом, вы должны перебрать список и проверить все записи, используя Arrays.equals(int[], int[]). Вот вспомогательный метод, который делает это:

public static boolean isInList(
    final List<int[]> list, final int[] candidate){

    for(final int[] item : list){
        if(Arrays.equals(item, candidate)){
            return true;
        }
    }
    return false;
}

Обновление: Начиная с Java 8, это стало намного проще:

public static boolean isInList(
        final List<int[]> list, final int[] candidate) {

    return list.stream().anyMatch(a -> Arrays.equals(a, candidate));
            //  ^-- or you may want to use .parallelStream() here instead
}
0 голосов
/ 31 января 2011

Сначала они не являются одинаковыми объектными ссылками, поэтому они не равны. equals () вернет false. Для вашего состояния вам нужно будет реализовать метод для их сравнения.

0 голосов
/ 31 января 2011

Два массива Java равны, если они имеют одинаковую ссылку на объект. Содержание не имеет значения.

Вы ищете способ проверить, имеют ли они одинаковое содержание. Это может помочь:

 Arrays.equals(new int[]{1,2}, new int[]{1,2});   // evaluates to true
 Arrays.equals(new int[]{1,2}, new int[]{2,1});   // evaluates to false (!)

Если порядок не влияет на равенство, вам придется самостоятельно реализовать метод статического равенства.

0 голосов
/ 31 января 2011

«содержит» проверки контракта на равенство.Так что в вашем случае то, что терпит неудачу, это равенство int [].Поскольку Array не переопределяет метод equals из Object, вам потребуется обходной путь для проверки на сдерживание.

Если вам нужно проверить наличие в Array, то у вас не останется иного выбора, кроме как перебрать ArrayList и выполнить сравнение самостоятельно.

0 голосов
/ 31 января 2011

из Java API:

public boolean contains(Object o)

Возвращает true, если этот список содержит указанный элемент. Более формально, возвращает true, если и только если этот список содержит хотя бы один элемент е такой что (o==null ? e==null : o.equals(e)).

, поскольку int[] является примитивом, я уверен, что метода .equals не существует, поэтому я думаю, он всегда будет возвращать false.

Я бы порекомендовал другой способ хранения данных? может быть, с каким-то ключом?

0 голосов
/ 31 января 2011

Вам нужно перебрать список и вручную проверить, соответствует ли массив вашим критериям.

public static boolean containsSubArray(List<int[]> j, int[] sub) {
   for ( int[] arr : j ) {
      if (arr contains elements of sub) {
         return true;
      }
   }
   return false;
}

Если вы хотите точное совпадение, вы можете использовать Arrays.equals(). Я не думаю, что есть библиотечная функция для создания содержимого, содержащегося в массиве, поэтому вам придется написать это самостоятельно, если вы этого хотите.

...