Коллекция Java. Самый быстрый способ найти, существует ли общий элемент между двумя наборами
У меня есть два набора. (из Guava HashMultimap.values ()). Мне нужно быстро найти, если пересечение двух множеств является непустым множеством. Мне не нужно знать об общих элементах, просто если есть общий элемент. Я думал об использовании Sets.intersection, но он o (m + n), мы можем поручиться, если найдем общий элемент без необходимости создания всего пересечения (что-то вроде set.intersection(set2).any()). (Набор данных довольно большой, и эта операция выполняется в цикле, и, следовательно, производительность имеет первостепенное значение.)
Любое предложение приветствуется. Спасибо.
Ответы
Ответ 1
С обычным JDK это просто
!Collections.disjoint(set1, set2)
Это немедленно освобождается, если элемент найден вообще.
(Хотя - для того, что стоит - Sets.intersection
является более ленивым, чем вы понимаете. Он возвращает представление в постоянное время, и его метод isEmpty()
также закладывает сразу же после нахождения первого общего элемента, поэтому он так же эффективны.)
Ответ 2
Вы можете использовать Collection # retainAll().
Сохраняет только элементы в этой коллекции, которые содержатся в указанная коллекция (дополнительная операция). Другими словами, удаляет из этой коллекции все ее элементы, которые не содержатся в указанной коллекции.