[英]How to implement a key-value pair with variability in the key
我正在編寫一些代碼來基於2個字段進行重復數據刪除:
我創建了一個POJO來保存此數據並用作TreeMap
鍵。 完整的數據集保留在值中-這樣,我僅將相關數據保留在內存中。
但是,下一個要求是UMI和整數具有可變性。 例如,以下兩個數據段將被視為基於具有1的變異性(不匹配)的UMI的重復數據。
一種。 “ AAA”,[200,300]
b。 “ ABA”,[200,300]
同樣,以下情況將被視為基於整數數組的重復項,給定的不匹配容差為2。
一種。 “ AAA”,[201,300]
b。 “ AAA”,[203,300]
我目前的嘗試是使此POJO實現Comparable
接口,並嘗試使用compareTo
方法來考慮可變性:
public class UMIPrimoKey implements Comparable<UMIPrimoKey> {
private final String UMI;
private final int[] ints;
private final int umiMisMatch;
private final int posMisMatch;
public UMIPrimoKey(String UMI, int[] ints, int umiMisMatch, int posMisMatch) {
this.UMI = UMI;
this.ints = ints;
this.umiMisMatch = umiMisMatch;
this.posMisMatch = posMisMatch;
}
@Override
public int compareTo(UMIPrimoKey o) {
if (!Arrays.equals(ints, o.ints)) {
if (ints.length == o.ints.length) {
for (int i = 0; i < ints.length; i++) {
if (Math.abs(ints[i] - o.ints[i]) > posMisMatch) {
return -1;
}
}
} else {
return -1;
}
}
if (XsamStringUtils.numberOfDifferences(UMI, o.UMI) <= umiMisMatch) {
return 0;
}
return 1;
}
}
XsamStringUtils.numberOfDifferences
只是一種簡單的靜態方法,用於計算兩個UMI之間的差異數。
如果數組中的任何兩個整數的差大於允許的不匹配( posMisMatch
),則我返回-1。 如果允許整數,並且UMI中的不匹配數小於umiMisMatch
指定的允許數量,則umiMisMatch
。
否則,由於UMI不匹配,將返回1。
然后,我在考慮了compareTo
方法的TreeMap
使用了此方法。
這在我的單元測試中有效,並添加了少量UMIPrimoKey
,但是運行完整的程序時,我得到一些奇怪的結果。 這可能是由於此處概述的方法規則所致: https : //docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html,但是我發現很難適應采用的代碼規則考慮在內。
任何方向表示贊賞,感謝您的閱讀!
根據compareTo的文檔 :
實現者必須確保所有x和y的sgn(x.compareTo(y))== -sgn(y.compareTo(x))。 (這意味着x.compareTo(y)必須拋出異常,而y.compareTo(x)則拋出異常。)
實現者還必須確保該關系是可傳遞的:(x.compareTo(y)> 0 && y.compareTo(z)> 0)意味着x.compareTo(z)> 0。
最后,實現者必須確保對於所有z,x.compareTo(y)== 0意味着sgn(x.compareTo(z))== sgn(y.compareTo(z))。
我認為這不適用於您的代碼,並且可能導致get函數找不到您的條目的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.