2016-06-14 7 views
6

以下のコードと4 HashSetが他の場所に配置されていることを考慮してください。3つ以上のHashSet間の交差を計算するにはどうすればよいですか?

私の目的は、すべての4つのHashSetに共通するすべての要素を含むことです。

私の質問はまず第一にそれは正しいことですか?第二に、私がそれを正しくやっているなら、それを行う良い方法はありますか?そうでない場合は、この問題に対してどのような解決策がありますか?

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

要素が実際に4つのセットすべてに共通する場合は、それを追加し続ける必要はありません(そのことについて少し考えてください)。 –

+0

いや、そうだね。 – lonesome

0

これを処理する最善の方法は、Groovyであると思います。私はあなたがグルーヴィーを求めていないことを知っていますが、いつでも私はすべてのコードを1行に変換できます。抵抗するのは難しいです。

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

関連する問題