Сравнить две коллекции
есть два HashSet
В первом 10млн строк
во втором 50млн.
нужно найти содержит ли второй сет строки присутствующие в первом.
Подскажите пожалуйста какой способ будет максимально эффективным?
Сеты вроде самые быстрые(?) поэтому использую их. Может другие коллекции более эффективны? Изначально это были ArrayList и я из них перегоняю сначала в сет потом хочу сравнить. Это правильный путь?
Добавлено через 2 часа 34 минуты
Может я как-то криво написала.
Есть множество HashSet [a, b, c, d, f, h]
есть множество HashSet2 [s, t, a, с]
нужно получить HashSet3=
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Сравнить две коллекции объектов по одному одинаковому полю
Народ, доброе утро всем! У меня есть две коллекции List. AArrayList<MyRequest>.
Сравнить 2 коллекции
Простите если не туда написал. Как сравнить 2 коллекции? ArrayList<Ware> ls1 и ArrayList<Ware>.
Сравнить две строки на соответствие
Здравствуйте! Подскажите пожалуйста, какая ошибка в этом коде; если я всё правильно понял, то.
Сравнить две String в формате UTF-8
Уважаемые форумчане. в соседней теме никто не ответил, потому попробую задать вопрос в новой теме.
3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220

Сообщение было отмечено Sma6nta как решение
Решение
в апаче коммонс есть ListUtils, а в нем есть intersection
Регистрация: 12.05.2019
Сообщений: 201
еще нашла вот такой вариант
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Возможно ли заполнить две коллекции Map сущностями одного типа в Spring Data JPA
Доброго всем времени суток. Подскажите пожалуйста, вот имеется сущность @Entity @Table(name =.
Как сравнить две переменные в session.createQuery
при формировании результирующего списка поиска нужно сравнивать 2 переменные даты. Первая из них.

Сравнить две коллекции с большим набором свойств, полученных от Get-Member
Есть две коллекции объектов $q1 и $q2, получаемые с помощью специфичного командлета (очереди WMQ).
AutoCompleteBox и две коллекции
Здравствуйте! Технология Silverlight Паттерн MVVM Prism (хотя вышеперечисленное вроде и.

Получение новой коллекции путем фильтрации элементов коллекции находящихся в другой коллекции
Всем привет, нуждаюсь в помощи знатоков) Имеется вот такая иерархия если представить в JSON:
Как связать две коллекции в разных классах?
Как связать 2 коллекции и каждая коллекция находиться в своём классе, то есть взаимодействие между.
Проверьте, равны ли два списка в Java
В этом посте будет обсуждаться, как проверить, равны ли два списка в Java. Список может быть списком примитивных типов или списком объектов. Два списка считаются равными, если они содержат одни и те же элементы в одном и том же порядке.
1. Использование List.equals() метод
Простое решение для сравнения двух списков примитивных типов на равенство заключается в использовании List.equals() метод. Он возвращает true, если оба списка имеют одинаковый размер и все соответствующие пары элементов в обоих списках равны.
Как сравнить два списка 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
Иногда при написании модульных тестов нам нужно сделать независимое от порядка сравнение списков. В этом коротком руководстве мы рассмотрим различные примеры написания таких модульных тестов.
2. Настройка
Согласно документации Java List#equals , два списка равны, если они содержат одни и те же элементы в одном и том же порядке. Следовательно, мы не можем просто использовать метод equals , так как мы хотим выполнять независимое от порядка сравнение.
В этом руководстве мы будем использовать эти три списка в качестве примеров входных данных для наших тестов:
List first = Arrays.asList(1, 3, 4, 6, 8); List second = Arrays.asList(8, 1, 6, 3, 4); List third = Arrays.asList(1, 3, 3, 6, 6);
Существуют разные способы сравнения независимо от порядка. Давайте посмотрим на них один за другим.
3. Использование JUnit
JUnit — это хорошо известная платформа, используемая для модульного тестирования в экосистеме Java.
Мы можем использовать приведенную ниже логику, чтобы сравнить равенство двух списков, используя методы assertTrue и assertFalse .
Здесь мы проверяем размер обоих списков и проверяем, содержит ли первый список все элементы второго списка и наоборот. Хотя это решение работает, оно не очень читабельно. Итак, теперь давайте рассмотрим некоторые альтернативы:
@Test public void whenTestingForOrderAgnosticEquality_ShouldBeTrue() assertTrue(first.size() == second.size() && first.containsAll(second) && second.containsAll(first)); >
В этом первом тесте размер обоих списков сравнивается, прежде чем мы проверяем, совпадают ли элементы в обоих списках. Поскольку оба этих условия возвращают значение true, наш тест будет пройден.
Давайте теперь посмотрим на неудачный тест:
@Test public void whenTestingForOrderAgnosticEquality_ShouldBeFalse() assertFalse(first.size() == third.size() && first.containsAll(third) && third.containsAll(first)); >
Напротив, в этой версии теста, хотя размер обоих списков одинаков, все элементы не совпадают.
4. Использование AssertJ
AssertJ — это управляемая сообществом библиотека с открытым исходным кодом, используемая для написания плавных и насыщенных утверждений в тестах Java.
Чтобы использовать его в нашем проекте maven, давайте добавим зависимость assertj-core в файл pom.xml :
dependency> groupId>org.assertjgroupId> artifactId>assertj-coreartifactId> version>3.16.1version> dependency>
Давайте напишем тест для сравнения равенства двух экземпляров списка одного и того же элемента и одного размера:
@Test void whenTestingForOrderAgnosticEqualityBothList_ShouldBeEqual() assertThat(first).hasSameElementsAs(second); >
В этом примере мы сначала проверяем, что содержит все элементы данной итерации и ничего больше, в любом порядке. Основным ограничением этого подхода является то, что метод hasSameElementsAs игнорирует дубликаты.
Давайте посмотрим на это на практике, чтобы понять, что мы имеем в виду:
@Test void whenTestingForOrderAgnosticEqualityBothList_ShouldNotBeEqual() List a = Arrays.asList("a", "a", "b", "c"); List b = Arrays.asList("a", "b", "c"); assertThat(a).hasSameElementsAs(b); >
В этом тесте, хотя у нас одинаковые элементы, размер обоих списков не равен, но утверждение все равно будет верным, так как оно игнорирует дубликаты. Чтобы это работало, нам нужно добавить проверку размера для обоих списков:
assertThat(a).hasSize(b.size()).hasSameElementsAs(b);
Добавление проверки размера обоих наших списков с последующим методом hasSameElementsAs действительно завершится ошибкой, как и ожидалось.
5. Использование хамкреста
Если мы уже используем Hamcrest или хотим использовать его для написания модульных тестов, вот как мы можем использовать метод Matchers#containsInAnyOrder для независимого от порядка сравнения.
Чтобы использовать Hamcrest в нашем проекте maven, давайте добавим зависимость hamcrest-all в файл pom.xml :
dependency> groupId>org.hamcrestgroupId> artifactId>hamcrest-allartifactId> version>1.3version> dependency>
@Test public void whenTestingForOrderAgnosticEquality_ShouldBeEqual() assertThat(first, Matchers.containsInAnyOrder(second.toArray())); >
Здесь метод containsInAnyOrder создает независимый от порядка сопоставитель для Iterables , который выполняет сопоставление с проверяемыми элементами Iterable . Этот тест сопоставляет элементы двух списков, игнорируя порядок элементов в списке.
К счастью, это решение не страдает от той же проблемы, которая описана в предыдущем разделе, поэтому нам не нужно явно сравнивать размеры.
6. Использование Apache Commons
Другой библиотекой или фреймворком помимо JUnit, Hamcrest или AssertJ, который мы можем использовать, является Apache CollectionUtils . Он предоставляет служебные методы для общих операций, которые охватывают широкий спектр вариантов использования и помогают нам избежать написания стандартного кода.
Чтобы использовать его в нашем проекте maven, добавим зависимость commons-collections4 в файл pom.xml :
dependency> groupId>org.apache.commonsgroupId> artifactId>commons-collections4artifactId> version>4.4version> dependency>
Вот тест с использованием CollectionUtils :
@Test public void whenTestingForOrderAgnosticEquality_ShouldBeTrueIfEqualOtherwiseFalse() assertTrue(CollectionUtils.isEqualCollection(first, second)); assertFalse(CollectionUtils.isEqualCollection(first, third)); >
Метод isEqualCollection возвращает значение true , если заданные коллекции содержат точно такие же элементы с одинаковым количеством элементов . В противном случае возвращается false .
7. Заключение
В этой статье мы рассмотрели, как проверить равенство двух экземпляров List , где элементы обоих списков упорядочены по-разному.
Все эти примеры можно найти на GitHub .
