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这将使您的代码更高效(没有重复项的情况下内存使用量更少)并消除以后搜索重复项的需要。
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方法在可读性和可维护性方面要好得多。
添加回答
举报
