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方法在可讀性和可維護性方面要好得多。
添加回答
舉報