我不知道 Java 8 可以做什么來計算重復項。我知道 Map 和 Set 的使用,但問題是:
public class Object(){
private int random_num;
private String random_str;
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Objects obj = (Objects) o;
return Int.compare(obj.random_int, random_int) == 0 && Objects.equals(random_str, obj.random_str);
}
我想比較 2 個物件只有在它們相同random_num
且相同時才相等random_str
,而另一個比較是 2 個物件僅在它們相同時才相等random_str
。
對于第一次比較,我會為random_num
andrandom_str
屬性做一個等號和哈希碼,做一個 Map 或 Set 來計算重復項。
我不知道我是否可以覆寫第二個 equals 以再次使用 Map 或 Set 計算重復項,或者需要用不同的方法來做。
uj5u.com熱心網友回復:
您的示例似乎適用于 Guava Equivalence或 Apache Equator類。如果需要自定義相等邏輯,這些類有時會很有幫助。與自然相關的方式與與Equivalence
自然Object.equals
相似。Comparator
Comparable
當然,您也可以在沒有外部庫的情況下執行相同操作:
- 創建兩個包裝類
YourObject
(命名Object
不是很好),比如說,WrapperByNum
和WrapperByNumAndStr
- 使用您想要的包裝類的任何欄位實作
equals
和包裝類hashCode
- 使用集合
Set<WrapperByNum>
等,然后使用提取原始類set.stream().map(wrapperByNum -> wrapperByNum.getYourObject())....
uj5u.com熱心網友回復:
假設您的目標是重復計數,并且有多種方法可以定義“等式”。由于不可能有 2equals
合 1 類,我們可以使用 Java record
,Collectors.groupingBy
在這種情況下可以成為方便的工具。
使用record
as key 的好處是
equals
并hashcode
自動實作- 它是不可變的。(這使得成為密鑰是安全的)
首先,我們需要使用我們想要的相等欄位創建一個記錄
record KeyWithFieldYouWant(Integer field1, String field2, ...){}
然后我們可以寫 group by
Map<KeyWithFieldYouWant, Long> countPerKey = objectList.stream().collect(Collectors.groupingBy(
customObject -> new KeyWithFieldYouWant(customObject.getField1(), customObject.getField2(), ...)
, Collectors.counting()
));
獲取每個鍵的計數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/517097.html
標籤:爪哇