如何实现键值可变的键值对

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

我正在编写一些代码以基于 2 个字段删除重复数据:

  1. 一串字符,我们称之为 UMI
  2. 整数数组

我创建了一个 POJO 来保存这些数据并作为 TreeMap 的键。完整的数据集保存在值中——这样我只将相关数据保存在内存中。

但是,下一个要求是 UMI 和整数具有可变性。例如,根据 UMI 的可变性(不匹配)为 1,以下两条数据将被视为重复数据。

一个。 "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的差异个数。

I return -1 如果数组中任意两个整数的差异大于允许的不匹配 (posMisMatch)。如果允许整数,则 0 被 return 编辑,并且 UMI 中的不匹配数小于允许的数量,由 umiMisMatch 指定。

否则,return编辑 1,因为 UMI 不匹配。

然后我在考虑了 compareTo 方法的 TreeMap 中使用了它。

这在我的单元测试中有效,添加了少量 UMIPrimoKey,但是当 运行 完成程序时我得到了一些奇怪的结果。这可能是由于此处概述的方法的规则所致:https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html 但我发现很难调整代码以将规则考虑在内。

不胜感激,感谢阅读!

根据compareTo的docs:

The implementor must ensure sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) for all x and y. (This implies that x.compareTo(y) must throw an exception iff y.compareTo(x) throws an exception.)

The implementor must also ensure that the relation is transitive: (x.compareTo(y)>0 && y.compareTo(z)>0) implies x.compareTo(z)>0.

Finally, the implementor must ensure that x.compareTo(y)==0 implies that sgn(x.compareTo(z)) == sgn(y.compareTo(z)), for all z.

我认为这不符合您的代码,这可能会导致 get 函数找不到您的条目时出现问题