2016-06-14 23 views
6

Aşağıdaki kodu göz önünde bulundurarak ve 4 HashSet s başka bir yerde olduğu gerçeğini göz önünde bulundurarak.İkiden fazla HashSets arasındaki kesişimi nasıl hesaplarım?

Amacam, 4 HashSets uygulamasında yaygın olan tüm öğeleri içermektir.

Benim sorum şu ki, her şeyden önce doğru mu yapıyorum? İkincisi, eğer doğru yapıyorumsa, bunu yapmanın daha iyi bir yolu var mı? Eğer değilse, o zaman bu problem için ne gibi bir çözüm var?

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

cevap

9

Ben sadece üçüncü, ikinci kullanarak, ilk sette retainAll() arayabilecek düşünüyorum ve dördüncü setleri parametreler olarak:

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

Bu yüzden 'retainAll() 'işlevini kullandığım her seferinde ilk kümeyi doldurmak için aşırı tepki gösteriyorum. Sadece bazı bilgilerin kaçırılmasından endişe ediyorum. – lonesome

+0

Bir öğe gerçekten dört kümenin hepsinde ortaksa, eklemeye devam etmeniz gerekmez (bunu bir an düşünün). –

+0

Yea, doğru görünüyor. – lonesome

0

Bunu ele almanın en iyi yolunun Groovy ile olduğunu düşünüyorum. Mükemmel bir şey istemediğini biliyorum, ama tüm bu kodu tek bir satıra dönüştürebilirim, buna direnmek zor.

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

Java 8 yeni biraz değilim, ama Bu oldukça okunabilir görünüyor:

@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); 
} 
:

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

denemek için hızlı bir JUnit testi var

+0

Nice - akarsu hakkında olsa gerek;) +1 – Chewy

İlgili konular