Сравните наборы внутри набора

У меня такой набор:

Set<Set<Node>> NestedSet = new HashSet<Set<Node>>();

[[Node[0], Node[1], Node[2]], [Node[0], Node[2], Node[6]], [Node[3], Node[4], Node[5]]]

Я хочу сравнить и объединить наборы, находящиеся внутри вложенного набора. [0,1,2] и [0,2,6] имеют общий элемент. поэтому следует объединить их, чтобы сформировать 0,1,2,6.

Вывод должен быть таким:

[[Node[0], Node[1], Node[2], Node[6]], [Node[3], Node[4], Node[5]]]

Есть ли действенный способ?


person priya    schedule 23.01.2016    source источник
comment
Вы можете использовать github.com/google/guava, чтобы иметь пересечение между двумя вложенными множествами, если пересечение › 0, то вы объединяете два множества. Конечно, это не самый эффективный способ, потому что в худшем случае приходится сравнивать O(n^2) элементов.   -  person Tommaso Pasini    schedule 23.01.2016


Ответы (1)


Вы можете использовать Collections.disjoint(Collection c1, Collection c2) для проверки двух указанных коллекций на отсутствие общих элементов.

Кстати, убедитесь, что ваш класс Node реализовал hashCode и equals

Set<Set<Node>> result = new HashSet<Set<Node>>();
for (Set<Node> s1 : NestedSet) {
    Optional<Set<Node>> findFirst = result.stream().filter(p -> !Collections.disjoint(s1, p)).findFirst();
    if (findFirst.isPresent()){
        findFirst.get().addAll(s1); 
    }
    else {
        result.add(s1);
    }
}
person Viet    schedule 23.01.2016
comment
Спасибо большое за вашу помощь. Это сработало! Но если я хочу добавить его в набор S1, только когда он имеет два общих элемента, то как это должно быть? что-то вроде этого: если (findFirst.isPresent() и count = 2), то добавить?? Является ли это возможным ? - person priya; 23.01.2016
comment
Да, вы можете сделать это с помощью функции continueAll: Необязательно‹Set‹Node›› findFirst = result.stream().filter(p -> {HashSet‹Node› temp = new HashSet‹›(s1); temp.retainAll(p ); вернуть temp.size() == 2; }).findFirst(); - person Viet; 24.01.2016
comment
Еще раз большое спасибо! но с этим что-то пошло не так. Это продолжение. ссылка . Не могли бы вы сослаться на эту ссылку. - person priya; 24.01.2016