2016-01-23 69 views
0

裏面我有一組這樣的:比較組一組

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]]] 

有沒有什麼有效的方法?

+0

您可以使用https://github.com/google/guava有兩個嵌套組之間的相交路口,如果> 0,則合併這兩個集。當然,這不是最有效的方式,因爲你必須在最壞的情況下比較O(n^2)元素。 –

回答

1

您可以使用Collections.disjoint(Collection c1, Collection c2)來檢查兩個指定的集合沒有共同的元素。

順便說一句確保您Node類實現hashCodeequals

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); 
    } 
} 
+0

非常感謝您的幫助。有效!但是,如果我想將它添加到S1集,只有當它有兩個共同的元素,那麼它應該是什麼?像這樣:if(findFirst.isPresent()和count = 2)然後添加??可能嗎 ? 。 \t temp.retainAll(P;> { \t HashSet的溫度=新的HashSet <>(S1) - 可選>使用FindFirst = result.stream()過濾器(P: – priya

+0

是你可以使用功能的retainAll做到這一點); \t return temp.size()== 2; })。findFirst(); – Jerry06

+0

再次感謝!但是這有些問題。這是後續行動。 [鏈接](http://stackoverflow.com/questions/34974460/merge-sets-when-two-elements-in-common)。你可以參考這個鏈接。 – priya