簡體   English   中英

如何在Java中檢查兩個集合之間差異的有效方法

[英]Efficient way how to check differences between two collections in Java

我有一個字符串List {1,2,7}

現在我有一個新List{2,4,9}

規則很簡單:

  1. 如果列表 A 上的元素在列表 B 中不存在,我們將其添加到新的刪除列表中
  2. 如果列表 B 上的元素在列表 A 中不存在,我們將其添加到新的創建列表
  3. 如果元素在兩個列表中都存在,我們就不要碰它

所以結果是兩個新列表:

刪除列表: {1,7}

創建列表: {4,9}

知道如何在java中使其高效嗎? 也許使用Java8使它更容易?

我的列表有大約 1000 個元素。

delete_list = A.copy();
create_list = B.copy();
delete_list.stream().removeIf(e -> B.contains(e));
create_list.stream().removeIf(e -> A.contains(e));

基本上我們只是創建兩個不同的列表。 在集合論中,我們可以這樣寫輸出:

delete_list = A \\ B
create_list = B\\A

感謝@SashaSalauyou 提醒我注意我犯的錯誤。

如果排序不重要,請使用Set批量操作:

Set<String> a = new HashSet<>(Arrays.asList("1", "2", "7"));
Set<String> b = new HashSet<>(Arrays.asList("2", "4", "9"));

Set<String> deleteSet = new HashSet<>(a);
deleteSet.removeAll(b);                   // [1, 7]
Set<String> createSet = new HashSet<>(b);
createSet.removeAll(a);                   // [4, 9]

如果您想要 Java 8,只需過濾元素並收集:

List<String> deleteList = a.stream().filter(e -> !b.contains(e)).collect(Collectors.toList());
List<String> createList = b.stream().filter(e -> !a.contains(e)).collect(Collectors.toList());

這里, ab可以是列表,但強烈建議將它們Set s,因為在大多數列表實現中contains()操作是 O(n)。

雖然不是很優雅的解決方案,但我們也可以在 Java8 中使用Streams

Set<String> setOne = new HashSet<>(Arrays.asList("1","2","7"));
Set<String> setTwo = new HashSet<>(Arrays.asList("2","4","9"));
System.out.println(setOne.stream().filter(i-> !setTwo.contains(i)).collect(Collectors.toList()));
System.out.println(setTwo.stream().filter(i-> !setOne.contains(i)).collect(Collectors.toList()));

它打印:

[1, 7] [4, 9]

重要的一點是setOnesetTwo應該是有效的 final 才能在 lambda 表達式中工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM