我正在编写一些代码,根据两个字段来消除重复数据:
-
一串字符,我们称之为umi
-
整数数组
我已经创建了一个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
但是我发现很难调整代码来考虑规则。
感谢您的指导,感谢您的阅读!