代码之家  ›  专栏  ›  技术社区  ›  Sam

如何实现键中具有可变性的键值对

  •  0
  • Sam  · 技术社区  · 6 年前

    我正在编写一些代码,根据两个字段来消除重复数据:

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

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

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

    A.“AAA”,[200300]

    B.“ABA”,[200300]

    同样,如果不匹配允许值为2,则以下内容将被视为基于整数数组的重复项。

    A.“AAA”,[201300]

    B.“AAA”,[203300]

    我目前的尝试是让这个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 只是一个简单的静态方法来计算两个umis之间的差异数。

    如果数组中任何两个整数的差大于允许的不匹配,则返回-1( posMisMatch )如果允许整数,并且umi中不匹配的数量小于允许的数量,则返回0,由指定 umiMisMatch .

    否则,由于umis不匹配,返回1。

    然后我用这个 树图 考虑到 比较函数 方法。

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

    感谢您的指导,感谢您的阅读!

    1 回复  |  直到 6 年前
        1
  •  2
  •   aBnormaLz    6 年前

    根据 docs 比较:

    实现者必须确保所有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。

    最后,实现者必须确保x.compareto(y)==0意味着所有z的sgn(x.compareto(z))==sgn(y.compareto(z))。

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