簡體   English   中英

如何實現具有可變性的鍵值對

[英]How to implement a key-value pair with variability in the key

我正在編寫一些代碼來基於2個字段進行重復數據刪除:

  1. 一串字符,我們稱其為UMI
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM