gpt4 book ai didi

Java:获取两个列表之间的不同条目 Map

转载 作者:行者123 更新时间:2023-12-01 08:54:57 26 4
gpt4 key购买 nike

我有两个列表 map 。我想根据对象的某些字段获取它们之间的不同条目。我创建了一个方法,如下所示:

private List<Map<String,Object>> GetDifferentEntries(List<Map<String,Object>> setA, List<Map<String,Object>> setB) {
List<Map<String,Object>> tmp = new ArrayList<Map<String,Object>>(setA);
for(Map<String,Object> a : tmp){
for(Map<String,Object> b: setB){
if(a.get("ID").equals(b.get("ID")) && a.get("ID1").equals(b.get("ID1")) ){
setA.remove(a);
}
} }return setA;}

我可以使用java 8中的Stream类再次编写上述方法吗?

我有一个例子:

 List1={ [ID=1, actor="A", ID1 = 1, film="F"], 
[ID=2, actor="B", ID1 = 1, film="F"],
[ID=3, actor="C", ID1 = 1, film="F"]}

List2={ [ID=1, director="A", ID1 = 1, film="F"],
[ID=5, director="E", ID1 = 1, film="F"]}

Result = { [ID=2, actor="B", ID1 = 1, film="F"],
[ID=3, actor="C", ID1 = 1, film="F"] }

最佳答案

我对 Java 8 流还不太熟悉,但是你的方法可以优化(正如我的评论中已经提到的),因此更容易重构为流。

首先,您不应该使用嵌套循环,而应该使用 2 个单独的循环。此外,您可能想要使用一个特殊的键对象来提供 IDID1以及 hashCode() 的适当实现和equals() 。示例:

class Key {
String id;
String id1;

int hashCode() { ... }
boolean equals(Object o) { ... }
}

然后构建一个LinkedHashMap对于第一个列表(您可以使用 HashMap 但这样您可以保留元素顺序):

Map<Key, Map<String, Object>> mapA = new LinkedHashMap<>();
for( for(Map<String,Object> a : setA){
mapA.put( new Key( a.get("ID"), a.get("ID1") ), a );
}

请注意,这假设您的列表不包含重复项,如果包含重复项,您需要稍微不同地执行此操作(但我会将其留给您)。

现在您已经获得了 setA 的 map 您可以消除 setB 中包含的元素:

for(Map<String,Object> b: setB){
//if the key is not present nothing will be removed
mapA.remove( new Key( b.get("ID"), b.get("ID1") ) );
}

最终构建了一个列表 mapA :

List<Map<String,Object>> prunedSetA = new ArrayList<>( mapA.values() );

正如您所看到的,您现在有 2 个循环,并且至少第二个循环可能会使用流。您也可以在第一个循环中执行此操作,但可能会丢失顺序。如果顺序不重要或者您在最后对列表进行了重新排序,那么这不是问题。

关于Java:获取两个列表之间的不同条目 Map<String, Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42086870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com