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

Как сравнить две коллекции java

Сравнение двух коллекций в Java

У меня есть две коллекции в Java-класс.Первая коллекция содержит предыдущие данные, вторая содержит обновленные данные из предыдущей коллекции.

Я хотел бы сравнить две коллекции, но я не уверен, что лучший способ это реализовать эффективно.Обе коллекции будут содержать одинаковое количество элементов.

на основе того, что тип карт одинаковый в каждой коллекции, я хочу выполнить метод carType.

любая помощь оценили

5 ответов

трудно помочь, потому что вы не сказали нам как вам нравится сравнивать коллекции (равного размера). Некоторые идеи, надеясь, что один подойдет:

сравнить обе коллекции, если они содержат одни и те же объекты в том же порядке

сравнить обе коллекции, если они содержат одни и те же объекты в любом порядке

найти элементы в другой коллекции, которая имеет изменено

основываясь на вашем комментарии, этот алгоритм сделает это. Он собирает все автомобили, которые были обновлены. Если результатом метода является пустой список, обе коллекции содержат одинаковые записи в одном порядке. Алгоритм использует о правильной реализации equals() на Car тип!

из арифметики множеств A и B равны iff a subsetequal B и B subsetequal A. Таким образом, в Java, учитывая две коллекции A и B, вы можете проверить их равенство без учета порядка элементов с

  • повторите первую коллекцию и добавьте ее в Map<Entity, Integer> whereby Entity класс хранится в вашей коллекции и Integer представляет количество раз, когда это происходит.
  • повторите вторую коллекцию и для каждого элемента попытайтесь найти ее в Map — если он существует, то уменьшите Integer value by one и выполните любое действие, необходимое при обнаружении совпадения. Если Integer значение достигло нуля, затем удалите (Entity, Integer) запись с карты.

этот алгоритм будет работать в линейном времени, предполагая, что вы реализовали эффективный hashCode() метод.

Как лучше всего сравнить две коллекции на Java и действовать в соответствии с ними?

У меня есть две коллекции одного и того же объекта, Collection<Foo> oldSet и Collection<Foo> newSet . Требуемая логика следующая:

  • если foo есть в (*), oldSet но нет newSet , позвоните doRemove(foo)
  • иначе , если foo не в oldSet но newSet , вызов doAdd(foo)
  • иначе, если он foo есть в обеих коллекциях, но изменен, вызовите doUpdate(oldFoo, newFoo)
  • иначе, если !foo.activated && foo.startDate >= now позвоните doStart(foo)
  • иначе, если foo.activated && foo.endDate <= now позвоните doEnd(foo)

(*) «in» означает совпадение уникального идентификатора, не обязательно содержимого.

Тока (устаревший код) делает много сравнений , чтобы выяснить removeSet , addSet , updateSet , startSet и endSet , а затем цикл действовать по каждому пункту.

Код довольно беспорядочный (отчасти потому, что я уже упустил некоторую логику спагетти), и я пытаюсь его реорганизовать. Дополнительная справочная информация:

  • Насколько мне известно, oldSet и newSet на самом деле поддерживаются ArrayList
  • Каждый набор содержит менее 100 предметов, скорее всего, максимум 20.
  • Этот код вызывается часто (измеряется в миллионах / день), хотя наборы редко отличаются
  • Если я конвертирую oldSet и newSet в HashMap<Foo> (порядок здесь не важен) с идентификаторами в качестве ключей, упростит ли это чтение и сравнение кода? Сколько времени и памяти теряется при преобразовании?
  • Будет ли повторение двух наборов и выполнение соответствующей операции более эффективным и кратким?

В библиотеке Apache commons.collections есть класс CollectionUtils, который предоставляет простые в использовании методы для управления / проверки коллекций, такие как пересечение, различие и объединение.

Документация API org.apache.commons.collections.CollectionUtils находится здесь .

Вы можете использовать потоки Java 8, например

Я создал приближение того, что, я думаю, вы ищете, просто используя Collections Framework в Java. Честно говоря, я думаю, что это, вероятно, излишество, как отмечает @Mike Deck. Для такого небольшого набора элементов для сравнения и обработки я думаю, что массивы были бы лучшим выбором с процедурной точки зрения, но вот мое псевдокодированное (потому что я ленивый) вариант. У меня есть предположение, что класс Foo сопоставим на основе его уникального идентификатора, а не всех данных в его содержимом:

Что касается ваших вопросов: если я конвертирую oldSet и newSet в HashMap (порядок здесь не важен) с идентификаторами в качестве ключей, упростит ли это чтение и сравнение кода? Сколько времени и памяти теряется при преобразовании? Я думаю, что вы, вероятно, сделаете код более читабельным, используя карту, НО . вы, вероятно, использовали бы больше памяти и времени во время преобразования.

Будет ли повторение двух наборов и выполнение соответствующей операции более эффективным и кратким? Да, это было бы лучшее из обоих миров, особенно если бы вы следовали совету @Mike Sharek о свертывании собственного списка с помощью специализированных методов или следовали чему-то вроде шаблона дизайна посетителей, чтобы просмотреть свою коллекцию и обработать каждый элемент.

Как сравнить две коллекции на Java?

Коллекция Java предоставляет архитектуру для хранения и управления группой объектов. Здесь мы увидим, как сравнивать элементы в коллекции в Java.

  • Возьмите оба входа с помощью функции asList ().
  • Отсортируйте их с помощью метода Collections.sort ().
  • Сравните их с помощью функции equals ().
  • Вывод на печать. (истина означает, что оба равны, а ложь означает, что оба они разные)

Example 1:

Example 2:

Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

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

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