2017-09-05 22 views
4

假設我有對象列表,每個對象都包含自己的字符串數組。我需要找到與給定數組重複的對象。 我可以簡單地通過使用一些for循環,如果和計數器,但我想用Java 8流做到這一點。我真的希望這是可能的。使用流找到兩個相似的數組

@Test 
public void test() { 

    String mainArray[] = {"a", "b", "c"}; 
    List<ElementsList> elems = new ArrayList<>(); 

    ElementsList a = new ElementsList(new String[]{"d", "e", "a"}); 
    ElementsList b = new ElementsList(new String[]{"b", "c", "d"}); 

    elems.add(a); 
    elems.add(b); 

    List<ElementsList> result = elems.stream()...; 

    assertTrue(result.contains(b)); 
} 

private class ElementsList { 

    private String elements[]; 

    private ElementsList(String elements[]) { 
     this.elements = elements; 
    } 

    public String[] getElements() { 
     return elements; 
    } 
} 
+0

重複的元素列表,或列表之間? – ByeBye

+0

在給定的數組(mainArray在這裏)和ElementList中的數組之間 –

回答

4

我能想到的這個例如:

List<String> main = Arrays.asList(mainArray); 
Stream.of(a, b) 
      .map(x -> new AbstractMap.SimpleEntry<>(x, new ArrayList<>(new ArrayList<>(Arrays.asList(x.elements))))) 
      .map(entry -> { 
       entry.getValue().removeAll(main); 
       entry.setValue(entry.getValue()); 
       return entry; 
      }) 
      .sorted(Comparator.comparing(e -> e.getValue().size())) 
      .map(Entry::getKey) 
      .forEach(el -> System.out.println(Arrays.toString(el.elements))); 

基本上把所有的元素融入一個可變的ListmainArray做好些的removeAll和排序結果基礎上的大小剩下的。

0

當列表具有不同的大小時,此解決方案更好。

List<String> main = Arrays.asList(mainArray); 
    Stream.of(a, c, b) 
      .map(x -> new AbstractMap.SimpleEntry<>(x, new ArrayList<>(main))) 
      .peek(entry -> { 
       entry.getValue().removeAll(Arrays.asList(entry.getKey().elements)); 
       entry.setValue(entry.getValue()); 
      }) 
      .sorted(Comparator.comparing(e -> e.getValue().size())) 
      .map(Map.Entry::getKey) 
      .forEach(el -> System.out.println(Arrays.toString(el.elements))); 
1

這裏有一個簡單的方法:

import static java.util.Comparator.comparingLong; 

Set<String> mainSet = new HashSet<>(Arrays.asList(mainArray)); 

ToLongFunction<ElementsList> countMatches = el -> 
     Arrays.stream(el.getElements()) 
      .filter(mainSet::contains) 
      .count(); 

ElementsList result = elems.stream() 
     .max(comparingLong(countMatches)) 
     .get(); // or throw if elems is empty 
相關問題