Статьи

Проверьте, равны ли два списка в Java

Вступление:

Списки на 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, являются их собственными.