Подтвердить что ты не робот

Инициирующий ордер

Возможный дубликат:
Java: проверка равенства массивов (порядок не имеет значения)

У меня есть два массива:

String[] a1 = {"a", "b", "c"};
String[] a2 = {"c", "b", "a"};

Мне нужно проверить, содержат ли оба одинаковые элементы (и одинаковой длины) независимо от порядка элементов.

Я пробовал Arrays.equals(a1, a2), но он рассматривает порядок элемента. org.apache.commons.lang.ArrayUtils не предоставляет эту вещь.

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

4b9b3361

Ответ 1

Если у вас есть эти массивы во что-то, наследующем коллекцию, вы можете просто использовать collection.containsAll( otherCollection ) из интерфейса Collection. Тем не менее, вам также потребуется сравнить длины этих двух, чтобы убедиться, что один набор не является надмножеством другого.

(Спасибо за участие в Aardvarkk и piegames.)

http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#containsAll(java.util.Collection)

Примечание. Это будет работать до определенной точки. Это определено для проверки хотя бы одного из существующих элементов. То есть, если у вас есть 3 a значения в одной коллекции и 7 a значения в другом, это не обязательно приведет к тому, что он будет называть их неравными.

Примеры:

[a, b, c] == [c, a, b]             // Works -- Mixed order
[a, b, c, d, d] == [a, b, d, c, d] // Works -- Mixed order with repeats
[a, b, c, d, d] == [a, b, b, c, d] // FAILS -- Different repeats
[a, b, c, d, d] != [a, b, c, d]    // Works -- Length differs with repeats
[a, b, c, d] != [a, b, c]          // Works -- Length differs
[a, b, d] != [a, b, c]             // Works -- Disjoint sets

Ответ 2

Я думаю, это может сработать для вас, сортировать первый массив с помощью

Arrays.sort(Object[]);

и после этого вы можете сравнить с

Arrays.equals(Object[],Object[]);

полный код:

String[] a1 = {"a", "b", "c"};
String[] a2 = {"c", "b", "a"};
Arrays.sort(a2);

boolean result= Arrays.equals(a1, a2);

Ответ 3

Преобразуйте списки в группы перед их сопоставлением:

new HashSet( Arrays.asList( a1 )).equals( new HashSet( Arrays.asList( a2 ) ));

В качестве альтернативы вы можете отсортировать массивы с помощью Arrays.sort(), но это может привести к поломке кода, который зависит от порядка элементов в массивах.

Ответ 4

Использовать метод java.util.Set equals. Сравнивает два набора одинакового размера, и каждый член указанного набора содержится в другом наборе.