如何实现键值可变的键值对
How to implement a key-value pair with variability in the key
我正在编写一些代码以基于 2 个字段删除重复数据:
- 一串字符,我们称之为 UMI
- 整数数组
我创建了一个 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 函数找不到您的条目时出现问题
我正在编写一些代码以基于 2 个字段删除重复数据:
- 一串字符,我们称之为 UMI
- 整数数组
我创建了一个 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 函数找不到您的条目时出现问题