2 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊
.equals()并且.hashCode()應(yīng)該被覆蓋以說明您的密鑰:mdl,ndc。gpi, 序列號 在這個(gè)網(wǎng)站上有無數(shù)的指南可以做到這一點(diǎn),但是像這樣:
@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);
}
如果這是一個(gè)問題,可能會有更有效的方法來實(shí)現(xiàn)它們。
然后你可以將你的列表轉(zhuǎn)換為一個(gè)集合:
Set<MyClass> set = new HashSet<>(list);
結(jié)果set不會有任何重復(fù),list = new ArrayList<>(set);如果需要,您現(xiàn)在可以用新值替換您的列表。
如果要保持原始列表中項(xiàng)目的順序,請實(shí)例化LinkedHashSet而不是HashSet.
與您的直接問題無關(guān),如果您想首先避免重復(fù),也許可以考慮使用 aSet而不是。List這將使您的代碼更高效(沒有重復(fù)項(xiàng)的情況下內(nèi)存使用量更少)并消除以后搜索重復(fù)項(xiàng)的需要。

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以嘗試執(zhí)行以下操作;
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, 意味著當(dāng)兩個(gè)對象相同時(shí),最終映射將包含較早的對象,后一個(gè)將被丟棄,如果您想要后一個(gè),可以更改此行為。
在哪里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方法,這在默認(rèn)狀態(tài)下的另一個(gè)邏輯中可能是必需的......另外明確展示你如何使用適當(dāng)?shù)姆椒〝嘌晕ㄒ恍员萭enerateUniqueKey隱藏該邏輯更好某些hashCode方法在可讀性和可維護(hù)性方面要好得多。
添加回答
舉報(bào)