2016-06-14 36 views
6

考慮下面的代碼以及其他地方的人口。如何計算兩個以上HashSets之間的交集?

我的目標是包含所有4個HashSets中常見的所有元素。

我的問題是,首先,我做對了嗎?其次,如果我做得對,有沒有更好的方法來做到這一點?如果不是,那麼我對這個問題有什麼解決方案?

static Set<String> one=new HashSet<>(); 
static Set<String> two=new HashSet<>(); 
static Set<String> three=new HashSet<>(); 
static Set<String> four=new HashSet<>(); 

private static void createIntersectionQrels() { 
    ArrayList<String> temp = new ArrayList<>(); 
    Set<String> interQrels = new HashSet<>(); 

    temp.addAll(one); 
    one.retainAll(two); 
    interQrels.addAll(one); 
    one.addAll(temp); 
    one.retainAll(three); 
    interQrels.addAll(one); 
    one.addAll(temp); 
    one.retainAll(four); 
    interQrels.addAll(one); 
    one.addAll(temp); 

    interQrels.retainAll(two); 
    interQrels.retainAll(three); 
    interQrels.retainAll(four); 
} 

回答

9

我想你可以簡單地可以稱之爲第一組retainAll(),使用第二,第三和第四套作爲參數:

private static Set<String> getIntersectionSet() { 
    // create a deep copy of one (in case you don't wish to modify it) 
    Set<String> interQrels = new HashSet<>(one); 

    interQrels.retainAll(two);  // intersection with two (and one) 
    interQrels.retainAll(three); // intersection with three (and two, one) 
    interQrels.retainAll(four); // intersection four (and three, two, one) 

    return interQrels; 
} 
+0

所以我只是做了過度反應,每次使用'retainAll()'時填充第一組?我只是擔心,如果一些信息被遺漏。 – lonesome

+0

如果一個元素真的對所有四個集合都是共同的,那麼你不需要繼續添加它(想一想)。 –

+0

是的,似乎是正確的。 – lonesome

0

我認爲最好的方法是使用Groovy。我知道你沒有要求groovy,但任何時候我可以將所有代碼轉換成一行,這很難抵制。

println one.intersect(two).intersect(three).intersect(four) 
3

我有點新到Java 8,但這似乎是相當可讀:

Set<String> intersection = one.stream() 
            .filter(two::contains) 
            .filter(three::contains) 
            .filter(four::contains) 
            .collect(Collectors.toSet()); 

這裏有一個快速JUnit測試嘗試:

@Test 
public void testIntersectionBetweenSets() { 
    Collection<String> one = new HashSet<>(4); 
    one.add("Larry"); 
    one.add("Mark"); 
    one.add("Henry"); 
    one.add("Andrew"); 
    Set<String> two = new HashSet<>(2); 
    two.add("Mark"); 
    two.add("Andrew"); 
    Set<String> three = new HashSet<>(3); 
    three.add("Mark"); 
    three.add("Mary"); 
    three.add("Andrew"); 
    Set<String> four = new HashSet<>(3); 
    four.add("Mark"); 
    four.add("John"); 
    four.add("Andrew"); 

    Set<String> intersection = one.stream() 
      .filter(two::contains) 
      .filter(three::contains) 
      .filter(four::contains) 
      .collect(Collectors.toSet()); 

    Collection<String> expected = new HashSet<>(2); 
    expected.add("Andrew"); 
    expected.add("Mark"); 
    Assert.assertEquals(expected, intersection); 
} 
+0

不錯 - 應該儘管關於流;)+1 – Chewy

相關問題