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

我想根据多个属性从数组列表中删除重复记录。这是一个示例域对象类:


private String mdl;

private String ndc;

private String gpi;

private String labelName;

private int seqNo;

private String vendorName;

mdl、ndc、gpi 和 seqNo 一起构成了唯一的记录。我想在检查这 4 个属性的数组列表中查找重复项,然后如果列表中已存在具有相同 4 个属性的记录,则从列表中删除该记录。


阿波罗的战车
浏览 120回答 2
2回答

拉丁的传说

.equals()并且.hashCode()应该被覆盖以说明您的密钥:mdl,ndc。gpi, 序列号 在这个网站上有无数的指南可以做到这一点,但是像这样:@Overridepublic boolean equals(Object obj) {&nbsp; &nbsp; if(obj != null && obj instanceof MyClass) {&nbsp; &nbsp; &nbsp; &nbsp; MyClass o = (MyClass)obj;&nbsp; &nbsp; &nbsp; &nbsp; return mdl.equals(o.mdl) && ndc.equals(o.ndc) &&&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gpi.equals(o.gpi) && seqNo == o.seqNo;&nbsp; &nbsp; }&nbsp; &nbsp; return false;}@Overridepublic int hashCode() {&nbsp; &nbsp; return Objects.hash(mdl, ndc, gpi, seqNo);}如果这是一个问题,可能会有更有效的方法来实现它们。然后你可以将你的列表转换为一个集合:Set<MyClass> set = new HashSet<>(list);结果set不会有任何重复,list = new ArrayList<>(set);如果需要,您现在可以用新值替换您的列表。如果要保持原始列表中项目的顺序,请实例化LinkedHashSet而不是HashSet.与您的直接问题无关,如果您想首先避免重复,也许可以考虑使用 aSet而不是。List这将使您的代码更高效(没有重复项的情况下内存使用量更少)并消除以后搜索重复项的需要。

料青山看我应如是

您可以尝试执行以下操作;List<Obj> list = ...; // list contains multiple objectsCollection<Obj> nonDuplicateCollection = list.stream()&nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toMap(Obj::generateUniqueKey, Function.identity(), (a, b) -> a))&nbsp; &nbsp; &nbsp; &nbsp; .values();(a, b) -> a, 意味着当两个对象相同时,最终映射将包含较早的对象,后一个将被丢弃,如果您想要后一个,可以更改此行为。在哪里Obj;public static class Obj {&nbsp; &nbsp; private String mdl;&nbsp; &nbsp; private String ndc;&nbsp; &nbsp; private String gpi;&nbsp; &nbsp; private String labelName;&nbsp; &nbsp; private int seqNo;&nbsp; &nbsp; private String vendorName;&nbsp; &nbsp; // other getter/setters&nbsp; &nbsp; public String generateUniqueKey() {&nbsp; &nbsp; &nbsp; &nbsp; return mdl + ndc + gpi + seqNo;&nbsp; &nbsp; }}我宁愿做这样的事情,而不是重写hashCode或equals方法,这在默认状态下的另一个逻辑中可能是必需的......另外明确展示你如何使用适当的方法断言唯一性比generateUniqueKey隐藏该逻辑更好某些hashCode方法在可读性和可维护性方面要好得多。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java