Как сравнить две коллекции 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

Как сравнить два 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, но он не будет сортировать массивы и надеюсь решит поставленные задачи. Ваш вариант мне тоже нравится.

Как сравнить объекты в java

Для сравнения объектов в Java используется метод equals() . Метод equals() сравнивает содержимое двух объектов на равенство.

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

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

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

public class Person  private String name; private int age; // конструктор и методы класса @Override public boolean equals(Object obj)  if (obj == this)  // проверка на идентичность return true; > if (!(obj instanceof Person))  // проверка типа объекта return false; > Person other = (Person) obj; // приведение объекта к типу Person return this.name.equals(other.name) && this.age == other.age; // сравнение содержимого > > 
  • в данном примере метод equals() сначала проверяет идентичность объектов и тип объекта,
  • затем сравнивает содержимое объектов — поля name и age ,
  • если оба поля равны у двух объектов, то метод возвращает true , иначе — false . *** Для сравнения объектов также можно использовать оператор == Он проверяет идентичность объектов, то есть указывают ли они на один и тот же объект в памяти. Однако, если объекты имеют разные ссылки на память, но содержат одинаковое содержимое, оператор == вернет false , в то время как метод equals() может вернуть true , если переопределен правильно.

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

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