Как сравнить два списка java
Перейти к содержимому

Как сравнить два списка java

  • автор:

Как сравнить два списка java

Чтобы сравнить два списка в Java , можно использовать метод equals() из класса java.util.List . Этот метод сравнивает содержимое двух списков.

import java.util.Arrays; import java.util.List; public class ListComparisonExample  public static void main(String[] args)  // Создаем два списка ListInteger> list1 = Arrays.asList(1, 2, 3); ListInteger> list2 = Arrays.asList(1, 2, 3); // Сравниваем два списка if (list1.equals(list2))  System.out.println("Списки равны"); > else  System.out.println("Списки не равны"); > > > 

В этом примере списки list1 и list2 содержат одни и те же элементы в том же порядке, поэтому метод equals() вернет true

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

Списки на Java упорядочены по природе. Таким образом, два списка считаются равными, если они содержат одинаковые элементы в одинаковом порядке. В этом уроке мы увидим, как сравнить два списка на равенство в Java.

Мы также рассмотрим способы сравнения элементов в двух списках и игнорирования их порядка.

Порядок поддержания равенства списков:

Как мы знаем, два списка равны, когда они имеют одинаковые элементы и в одинаковом порядке. Поэтому, если мы заботимся о порядке, мы можем использовать метод equals () для проверки равенства:

public void equalityCheckOfTwoLists() < List list1 = Arrays.asList( 1 , 2 , 3 );
List list2 = Arrays.asList( 1 , 2 , 3 );
List list3 = Arrays.asList( 2 , 1 , 3 );
assertTrue(list1.equals(list2));
assertFalse(list1.equals(list3));

И list1, и list3 содержат одинаковые элементы , но в разных порядках и поэтому считаются неравными.

Порядок игнорирования равенства списков:

Что если мы хотим игнорировать порядок элементов для проверки на равенство?

Много раз все, что мы хотим, это проверить, содержат ли два списка одинаковые элементы, независимо от их порядка в списке. Давайте рассмотрим способы достижения этого:

1. Сортировка списков и сравнение:

Если оба списка нулевые , мы вернем true . Или же, если только один из них указывает на нулевое значение или размер () двух списков отличается, мы вернем false . Если ни одно из этих условий не выполняется, мы сначала отсортируем два списка, а затем сравним их:

public > boolean isEquals(List list1, List 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(list1);
list2 = new ArrayList(list2);
Collections.sort(list1);
Collections.sort(list2);
return list1.equals(list2);

Обратите внимание, что мы создали копии двух списков, чтобы гарантировать, что элементы в исходных списках остаются нетронутыми .

2. С помощью Set / содержит () Проверьте:

Если данные в наших списках уникальны, т.е. нет дублирования, мы можем просто создать TreeSets из заданных списков и затем сравнить их с помощью equals () :

public > boolean isEquals(List list1, List 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 set1 = new TreeSet<>(list1);
Set set2 = new TreeSet<>(list2);
return set1.equals(set2);

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

return list1.containsAll(list2) && list2.containsAll(list1);

Однако обратите внимание, что эти подходы ( contains () check / With Sets ) потерпят неудачу, если в нашем наборе данных есть повторы. Например:

List list1 = Arrays.asList( 1 , 2 , 3 , 3 );
List 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 :

List list1 = Arrays.asList( 1 , 2 , 3 , 3 );
List 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, являются их собственными.

Как сравнить два ArrayList`a по их содержимому?

Я бы сделал так:
1. Сделал бы мапу из обоих листов, где ключ — номер, счёта, а значение — сам объект.
2. По этому ключу объединил бы обе мапы в одну, но значение было бы Tupple2 . Т.о. в одном таппле были бы оба объекта с одинаковыми номером счета.
3. По значениям в итоговой коллекции можно будет производить все интересующие операции.

Ответ написан более двух лет назад
Нравится 1 4 комментария
Odissey Nemo @odissey_nemo

Да, это было бы эффективнее, хотя тоже не слишком понятно с первого взгляда.

Наблюдал, что просто использование стримов, где только можно, резко тормозит скорость работы программы.
Старые добрые и простые коллекции , в этом плане, гораздо быстрее. Хотя бы за счёт вынужденной продуманности их применения.

Я так понимаю, человеку надо найти в двух списках все одинаковые чеки PaymentPartner и PaymentRBS с одинаковыми номерами счетов и суммами в них?
При этом ведь могут быть даже одинаковые чеки с теми же суммами в любом списке, например.
Если да то, может быть, удастся обойтись одним Set, если бы оба класса были бы одинаковыми или имели общий интерфейс/класс-предок для getAccount и getSum(). И переписать у них hashCode() и equals() так, чтобы они захватывали и аккаунт и сумму.
hasCode() можно сделать как для строки, состоящей из текстовых представлений аккаунта и суммы, через запятую. Например:

public int hashCode()

В этом случае Set заполнить из списка rbsList. Затем пройтись по всему списку из partnerList, изучая. если ли элементы из него уже в Set. Те элементы из partnerList, что уже присутствуют в Set и есть искомые PaymentPartner. имеющие аналог в rbsList.
Итого — всего по одному проходу по каждому списка (N+M). В отличи от M*N сравнений в указанном коде.
Не уверен точно, но кажется работоспособным. С учётом высказанных выше пожеланий к классам.

student_1 @student_1 Автор вопроса

Я так понимаю, человеку надо найти в двух списках все одинаковые чеки PaymentPartner и PaymentRBS с одинаковыми номерами счетов и суммами в них?

Dmitry Roo @xez Куратор тега Java

Наблюдал, что просто использование стримов, где только можно, резко тормозит скорость работы программы.
Старые добрые и простые коллекции , в этом плане, гораздо быстрее. Хотя бы за счёт вынужденной продуманности их применения.

Как по мне, решения через «циклы + коллекции» ни разу не простые. Стримы немного понятнее и проще.
Насчёт скорости работы — очень хочется посмотреть пруфы (если есть)

Odissey Nemo @odissey_nemo

Dmitry Roo,
Дело вкуса. Мне привычнее и понятнее циклы и коллекции. Стримы просто без надобности.
Хотя не отрицаю, что кода с ними меньше. Но меньше — не значит понятнее. Чем выше абстракция, тем она обычно сложнее.

Пруфы в Инете не искал. Делал сам.
А циклы и коллекции быстрее по простой причине. Стримы слишком универсальны. должны удовлетворить всем типам данных. Поэтому с помощью них трудно выбрать все варианты и особенности структур данных. Например, в одном цикле можно сделать несколько произвольных операций над элементом коллекции, что является естественным.
В то же время стримы. их операторы делают что-либо на лету, за один проход. Стало быть. понадобится несколько проходов для доступа к разным элементам и их данным.
Грубо говоря, там где надо два стрима запустить, достаточно одного цикла.
В любом случае, разница в производительности вряд ли будет критической. Главное — понятность и ясность кода для автора. И для будущих читателей.
Это — главное!

Java. ArrayList. Сравнить содержимое двух листов без учета последовательности

Необходим метод выясняющий равны ли значения их ячеек без учета их порядка и последовательности то есть эти можно считать равными = true; Имея в виду что таких элементов может быть и много. Можно использовать любые фичи кроме фраимворков. Может есть короткий способ, наверняка сан предусмотрел такое дело. Может кто знает?

Отслеживать
задан 8 ноя 2016 в 11:44
5,327 12 12 золотых знаков 59 59 серебряных знаков 118 118 бронзовых знаков
containsAll(Collection c) пробовали?
8 ноя 2016 в 11:48

@MrFylypenko если у второго списка, например, убрать один из «a» (например последний), то containsAll покажет true все равно

8 ноя 2016 в 11:54
Не знал про этот метод спасибо!
8 ноя 2016 в 11:55

@АлексейШиманский верно, покажет true, но он не будет сортировать массивы и надеюсь решит поставленные задачи. Ваш вариант мне тоже нравится.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *