2013-09-17 1 views
10

У меня есть два набора. (из Guava HashMultimap.values ​​()). Мне нужно быстро найти, если пересечение двух множеств является непустым множеством. Мне не нужно знать об общих элементах, просто если есть общий элемент. Я думал об использовании Sets.intersection, но это o (m + n), мы можем поручиться, если найдем общий элемент без создания всего пересечения (что-то вроде set.intersection (set2) .any()). (Набор данных довольно большой, и эта операция выполняется в пределах цикла, и, следовательно, производительность имеет первостепенное значение.)Коллекция Java. Самый быстрый способ найти, существует ли общий элемент между двумя наборами

Любое предложение приветствуется. Спасибо.

ответ

4

Вы можете использовать Collection#retainAll().

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

+1

Но это похоже на Sets.intersection() справа. Эта операция по-прежнему создает полное пересечение. –

+0

@ doc_180: - Да, это правильно. Вы можете попытаться пойти с идеей Луи Вассермана. Это то, что вы хотите, вероятно! –

+0

Я собираюсь использовать его идею. Sets.intersection может просто работать, поскольку он ленив. Спасибо, что ответили. –

19

С нормальным JDK, это просто

!Collections.disjoint(set1, set2) 

Это выручает немедленно, если элемент найден в общем.

(Несмотря на то, что это стоит - Sets.intersection является более ленивым, чем вы понимаете. Он возвращает вид в постоянное время, и его метод isEmpty() также залогом сразу же после обнаружения первого элемента вместе, так же эффективно.)

+0

Спасибо. Sets.intersection(). IsEmpty работает нормально. –

Смежные вопросы