为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据多个属性删除 ArrayList 中的重复项

如何根据多个属性删除 ArrayList 中的重复项

阿波罗的战车 2023-03-23 14:56:02
我想根据多个属性从数组列表中删除重复记录。这是一个示例域对象类:private String mdl;private String ndc;private String gpi;private String labelName;private int seqNo;private String vendorName;mdl、ndc、gpi 和 seqNo 一起构成了唯一的记录。我想在检查这 4 个属性的数组列表中查找重复项,然后如果列表中已存在具有相同 4 个属性的记录,则从列表中删除该记录。
查看完整描述

2 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

.equals()并且.hashCode()应该被覆盖以说明您的密钥:mdl,ndc。gpi, 序列号 在这个网站上有无数的指南可以做到这一点,但是像这样:


@Override

public boolean equals(Object obj) {

    if(obj != null && obj instanceof MyClass) {

        MyClass o = (MyClass)obj;

        return mdl.equals(o.mdl) && ndc.equals(o.ndc) &&

          gpi.equals(o.gpi) && seqNo == o.seqNo;

    }

    return false;

}


@Override

public int hashCode() {

    return Objects.hash(mdl, ndc, gpi, seqNo);

}

如果这是一个问题,可能会有更有效的方法来实现它们。


然后你可以将你的列表转换为一个集合:


Set<MyClass> set = new HashSet<>(list);

结果set不会有任何重复,list = new ArrayList<>(set);如果需要,您现在可以用新值替换您的列表。


如果要保持原始列表中项目的顺序,请实例化LinkedHashSet而不是HashSet.


与您的直接问题无关,如果您想首先避免重复,也许可以考虑使用 aSet而不是。List这将使您的代码更高效(没有重复项的情况下内存使用量更少)并消除以后搜索重复项的需要。


查看完整回答
反对 回复 2023-03-23
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

您可以尝试执行以下操作;


List<Obj> list = ...; // list contains multiple objects

Collection<Obj> nonDuplicateCollection = list.stream()

        .collect(Collectors.toMap(Obj::generateUniqueKey, Function.identity(), (a, b) -> a))

        .values();

(a, b) -> a, 意味着当两个对象相同时,最终映射将包含较早的对象,后一个将被丢弃,如果您想要后一个,可以更改此行为。


在哪里Obj;


public static class Obj {


    private String mdl;

    private String ndc;

    private String gpi;

    private String labelName;

    private int seqNo;

    private String vendorName;


    // other getter/setters


    public String generateUniqueKey() {

        return mdl + ndc + gpi + seqNo;

    }

}

我宁愿做这样的事情,而不是重写hashCode或equals方法,这在默认状态下的另一个逻辑中可能是必需的......另外明确展示你如何使用适当的方法断言唯一性比generateUniqueKey隐藏该逻辑更好某些hashCode方法在可读性和可维护性方面要好得多。


查看完整回答
反对 回复 2023-03-23
  • 2 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号