当前位置: 首页 > 知识库问答 >
问题:

根据java 8中多个属性的属性从对象列表中分离重复和非重复

白翰海
2023-03-14

我想使用java 8根据属性customerId和customerRegistration从对象列表中分离重复项和非重复项

分离意义

如果我有3条记录具有相同的customerId和customerRegistration,则第一条记录应添加到非重复列表中,第二条记录应被添加到重复列表中。

我在下面的pojo类中创建了基于customerId和customerRegistration的hashcode和equals方法。

public class Asset {

private String customerName;    
private int customerId;   
private String Type;   
private String customerRegistration;   
private int assetTagList;   
private String rso;    
private String active;   
private int billableUser;    
private int billableAsset;

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Asset asset = (Asset) o;
    return customerId == asset.customerId && Objects.equals(customerRegistration, asset.customerRegistration);
}

@Override
public int hashCode() {
    return Objects.hash(customerId, customerRegistration);
}

}

我已经在java7中编写了以下逻辑,这将正常工作,有没有办法使用流编写(将以下代码中的forloop逻辑转换为流)?

public  Map<String ,List<Asset>> execute1() throws IOException {

    List<Asset> assetList=new ArrayList<>();
    Set<Asset> set=new HashSet<>();
    List<Asset> duplicateList=new ArrayList<>();
    List<Asset> nonDuplicateList=new ArrayList<>();
    Map<String ,List<Asset>> map = new HashMap<>();
    Asset asset1 = new Asset("French Customer1", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
    Asset asset2 = new Asset("French Customer2", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
    
    Asset asset3 = new Asset("French Customer3", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
    Asset asset4= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
    Asset asset5= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
    
    Asset asset6 = new Asset("French Customer5", 674, "Vehicle", "KNH 9008", 175, "FR", "Yes", 0, 0);
    
    assetList.add(asset1); 
    assetList.add(asset2);
    assetList.add(asset3);
    assetList.add(asset4);
    assetList.add(asset5);
    assetList.add(asset6);


    for (Asset assetTemp:assetList){
        if(set.add(assetTemp)){
            nonDuplicateList.add(assetTemp);
        }
        else {
            duplicateList.add(assetTemp);
        }
    }

    map.put("duplicate",duplicateList);
    map.put("nonDuplicateList",nonDuplicateList);
    
    
   return map
}

预期输出如下(来自上述execute1函数中定义的输入资产列表)

非重复列表应具有(资产1,资产3,资产6):

Asset asset1 = new Asset("French Customer1", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
Asset asset3 = new Asset("French Customer3", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset6 = new Asset("French Customer5", 674, "Vehicle", "KNH 9008", 175, "FR", "Yes", 0, 0);

CopicateList应该有:(asset2, asset4, asset5)

Asset asset2 = new Asset("French Customer2", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
Asset asset4= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset5= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);

共有2个答案

阎麒
2023-03-14

您可以使用相同的方法使用<code>集

java prettyprint-override">assetList.stream().collect(Collectors.partitioningBy(set::add));

这将返回一个带有< code>Boolean键的映射,其中< code>true是非重复的。

祁柏
2023-03-14

您可以根据添加到集合中返回true或false对元素进行分组:

public  static Map<String ,List<Asset>> execute2() throws IOException {

    List<Asset> assetList=new ArrayList<>();
    Asset asset1 = new Asset("French Customer1", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
    Asset asset2 = new Asset("French Customer2", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);

    Asset asset3 = new Asset("French Customer3", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
    Asset asset4= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
    Asset asset5= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);

    Asset asset6 = new Asset("French Customer5", 674, "Vehicle", "KNH 9008", 175, "FR", "Yes", 0, 0);

    assetList.add(asset1);
    assetList.add(asset2);
    assetList.add(asset3);
    assetList.add(asset4);
    assetList.add(asset5);
    assetList.add(asset6);

    Set<Asset> set=new HashSet<>();
    return assetList.stream().collect(Collectors.groupingBy(x -> set.add(x) ? "nonDuplicateList" : "duplicate"));
}
 类似资料:
  • 问题内容: 试图从基于某些属性的对象列表中删除重复项。 我们可以使用Java 8以简单的方式做到吗 我们可以根据员工的财产从中删除重复项吗?我看到过从字符串arraylist中删除重复字符串的帖子。 问题答案: 你可以从获取流并将其放入其中,从中提供一个唯一比较ID的自定义比较器。 然后,如果你确实需要一个列表,则可以将该集合放回到ArrayList中。 给出示例: 它将输出: 另一个想法可能是使

  • 我有一份包含订单项目列表的订单 如果在这个列表中我有以下项目 我想计算订单所有者名称相同的值之和。 e、 g.如果所有者名称为“John”,则返回417.00,如果名称为“Doe”,则返回19.00。 我怎么能通过小溪Java呢?非常感谢

  • 我正试图从基于某些属性的对象列表中删除重复项。 我们能用一种简单的方法使用Java8吗 我们是否可以根据员工的属性删除其中的重复项。我看到过从String的arraylist中删除重复字符串的帖子。

  • 假设我有一个名为House的对象,它包含一个列表 对于房间,只有一个属性,其值由int表示: 现在,使用Java8,并给出一个带有

  • 我有一个这样定义的类: 现在我有一个项目对象列表,现在我想找到所有项目的总价。在Java8中我们如何做到这一点? 如果列表是简单的整数,那么我们在这里给出了解决方案--如何用java流求和整数列表?

  • 问题内容: 这个问题已经在这里有了答案 : 调用非对象上的成员函数[重复] (8个答案) 6年前关闭。 在控制页面上: 在查看页面上: 错误是: 注意:尝试在第22行的C:\ wamp \ www \ phone \ pages \ init.php中获取非对象的属性 你能修好它吗?我不知道发生了什么。 问题答案: 检查手册。它返回一个对象,而不是对象数组。 我猜你想要这样的东西 可能我建议您看看