【发布时间】:2018-01-17 08:57:31
【问题描述】:
我正在尝试使用自定义比较器实现 NavigableMap,该比较器基于值而不是键进行比较。我对 Java 和一般编码非常了解,所以如果我的术语不正确或代码很糟糕,请原谅我!我已经尝试找到类似的问题来尝试复制解决方案,但在尝试编译时仍然收到以下错误:
java: no suitable constructor found for TreeMap(OrderLineSegments)
constructor java.util.TreeMap.TreeMap(java.util.Comparator<? super java.lang.Float>) is not applicable
(argument mismatch; OrderLineSegments cannot be converted to java.util.Comparator<? super java.lang.Float>)
constructor java.util.TreeMap.TreeMap(java.util.Map<? extends java.lang.Float,? extends java.lang.Float[]>) is not applicable
(argument mismatch; OrderLineSegments cannot be converted to java.util.Map<? extends java.lang.Float,? extends java.lang.Float[]>)
constructor java.util.TreeMap.TreeMap(java.util.SortedMap<java.lang.Float,? extends java.lang.Float[]>) is not applicable
(argument mismatch; OrderLineSegments cannot be converted to java.util.SortedMap<java.lang.Float,? extends java.lang.Float[]>)
我正在尝试实现以下内容,其中 Float[] 是表示线段的 4 个浮点数 [x1,y1,x2,y2] 的数组。
NavigableMap<Float, Float[]> segmentBST = new TreeMap<Float, Float[]>( new OrderLineSegments() );
class OrderLineSegments implements Comparator<Map.Entry<Float, Float[]>> {
public int compare(Map.Entry<Float, Float[]> a, Map.Entry<Float, Float[]> b) {
float ypos;
if (a.getValue()[1] < a.getValue()[1]) {
ypos = a.getValue()[1];
} else {
ypos = b.getValue()[1];
}
float ratioA = (a.getValue()[1] - ypos) / (ypos - a.getValue()[3]);
float ratioB = (b.getValue()[1] - ypos) / (ypos - b.getValue()[3]);
float posA = Math.abs(a.getValue()[0] - a.getValue()[2]) * ratioA + a.getValue()[0];
float posB = Math.abs(b.getValue()[0] - b.getValue()[2]) * ratioB + b.getValue()[0];
if (posA < posB) return 1;
if (posA > posB) return -1;
return 0;
}
我什至不确定这是否是最好的方法,或者这是否可能,因此非常感谢任何帮助。
【问题讨论】:
-
Comparator是用来比较keys的,所以OrderLineSegments需要实现Comparator<Float>。因此,当您尝试比较Map.Entry时会出现错误。 -
该错误似乎很正常,正如文档所说:
constructor of TreeMap<K,V> requires Comparator<? super K>并且您提供了Comparator<Entry<K,V>>它不能像,您不能反转键和值吗?如果你没有相同的值,你可以改变 -
你违反了 NavigableMap 的合同。在这种情况下,为什么不直接使用排序列表?
-
@Kayaman 我还在学习如何解释 java 文档——现在这似乎很明显了!
-
@daniu 我认为 NavigableMap 是最好的解决方案,因为它带有higherEntry 和lowerEntry(这也在O(ln(n)) 中运行)
标签: java dictionary compare comparator