Вступление:
Списки на Java упорядочены по природе. Таким образом, два списка считаются равными, если они содержат одинаковые элементы в одинаковом порядке. В этом уроке мы увидим, как сравнить два списка на равенство в Java.
Мы также рассмотрим способы сравнения элементов в двух списках и игнорирования их порядка.
Порядок поддержания равенства списков:
Как мы знаем, два списка равны, когда они имеют одинаковые элементы и в одинаковом порядке. Поэтому, если мы заботимся о порядке, мы можем использовать метод equals () для проверки равенства:
Ява
01
02
03
04
05
06
07
08
09
10
11
|
@Test public void equalityCheckOfTwoLists() { List<Integer> list1 = Arrays.asList( 1 , 2 , 3 ); List<Integer> list2 = Arrays.asList( 1 , 2 , 3 ); List<Integer> list3 = Arrays.asList( 2 , 1 , 3 ); assertTrue(list1.equals(list2)); assertFalse(list1.equals(list3)); } |
И list1, и list3 содержат одинаковые элементы {1, 2, 3}, но в разных порядках и поэтому считаются неравными.
Порядок игнорирования равенства списков:
Что если мы хотим игнорировать порядок элементов для проверки на равенство?
Много раз все, что мы хотим, это проверить, содержат ли два списка одинаковые элементы, независимо от их порядка в списке. Давайте рассмотрим способы достижения этого:
1. Сортировка списков и сравнение:
Если оба списка нулевые , мы вернем true . Или же, если только один из них указывает на нулевое значение или размер () двух списков отличается, мы вернем false . Если ни одно из этих условий не выполняется, мы сначала отсортируем два списка, а затем сравним их:
Ява
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
public <T extends Comparable<T>> boolean isEquals(List<T> list1, List<T> list2){ if (list1 == null && list2 == null ) { return true ; } //Only one of them is null else if (list1 == null || list2 == null ) { return false ; } else if (list1.size() != list2.size()) { return false ; } //copying to avoid rearranging original lists list1 = new ArrayList<T>(list1); list2 = new ArrayList<T>(list2); Collections.sort(list1); Collections.sort(list2); return list1.equals(list2); } |
Обратите внимание, что мы создали копии двух списков, чтобы гарантировать, что элементы в исходных списках остаются нетронутыми .
2. С помощью Set / содержит () Проверьте:
Если данные в наших списках уникальны, т.е. нет дублирования, мы можем просто создать TreeSets из заданных списков и затем сравнить их с помощью equals () :
Ява
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public <T extends Comparable<T>> boolean isEquals(List<T> list1, List<T> list2){ if (list1 == null && list2 == null ) { return true ; } //Only one of them is null else if (list1 == null || list2 == null ) { return false ; } else if (list1.size() != list2.size()) { return false ; } Set<T> set1 = new TreeSet<>(list1); Set<T> set2 = new TreeSet<>(list2); return set1.equals(set2); } |
Мы можем еще больше упростить это, просто установив проверку на проверку содержимого () вместо создания наборов :
Ява
1
|
return list1.containsAll(list2) && list2.containsAll(list1); |
Однако обратите внимание, что эти подходы ( contains () check / With Sets ) потерпят неудачу, если в нашем наборе данных есть повторы. Например:
Ява
1
2
3
4
5
|
List<Integer> list1 = Arrays.asList( 1 , 2 , 3 , 3 ); List<Integer> list2 = Arrays.asList( 3 , 1 , 2 , 2 ); // will return true, but actual value should be false System.out.println(list1.isEquals(list2)); |
В приведенном выше примере l ist1 содержит одно 2 и два 3, а list2 содержит два 2 и одно 3 . Тем не менее, эта форма реализации будет неверно возвращать true .
3. Apache Commons:
Вместо написания собственного кода мы можем выбрать для выполнения утилиту Apache Commons Collections :
Ява
1
2
3
4
|
List<Integer> list1 = Arrays.asList( 1 , 2 , 3 , 3 ); List<Integer> list2 = Arrays.asList( 3 , 1 , 3 , 2 ); System.out.println(CollectionUtils.isEqualCollection(list1, list2)); //true |
Метод isEqualCollection () возвращает true, если две коллекции содержат абсолютно одинаковые элементы с одинаковым количеством элементов.
Вывод:
В этом уроке мы научились проверять, равны ли два списка в Java. Теперь мы знаем, что по умолчанию два списка равны, если они имеют одинаковые элементы в одинаковом порядке.
Мы также обсудили подходы, которые мы можем использовать для проверки равенства списков, если мы не заботимся о порядке элементов.
Оставьте первый комментарий.
Опубликовано на Java Code Geeks с разрешения Шубхры Шриваставы, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Проверьте, равны ли два списка в Java Мнения, высказанные участниками Java Code Geeks, являются их собственными. |