我正在尝试使用自定义比较器实现NavigableMap,该比较基于值而不是按键进行比较。我非常了解java和一般编码,所以如果我的术语是inccorect或代码可怕,请原谅我!我试图寻找类似的问题,试图复制解决方案,但我仍然recieving以下错误,当我尝试编译:NavigableMap - 基于值进行比较
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[]>)
我想实现以下内容,其中浮法[]为4个float数组[ 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;
}
我甚至不确定这是否是最好的方法来做到这一点,或者如果这是甚至可能,所以任何援助非常感谢。
“比较器”用于比较*键*,因此'OrderLineSegments'需要实现'比较器'。因此,当您尝试比较Map.Entry时出错。 –
Kayaman
错误似乎很正常,因为文档说:'TreeMap的构造函数需要比较器 super K>',并且您提供了一个'比较器>'它不能像,不能反转键和值吗?如果您没有相同的值,则可能会更改 –
azro
您正在违反NavigableMap的合同。为什么不在这种情况下使用排序列表? – daniu