Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的树形图在排序后会断开,因为;用于树映射的比较器与equals不一致;_Java_Sorting_Map - Fatal编程技术网

Java 我的树形图在排序后会断开,因为;用于树映射的比较器与equals不一致;

Java 我的树形图在排序后会断开,因为;用于树映射的比较器与equals不一致;,java,sorting,map,Java,Sorting,Map,我需要根据树形图的值对其进行排序。我所做的工作的要求是,我必须使用一个排序的地图。我在这里尝试了解决方案:但是正如评论所说,这将使从我的地图中获取值不起作用。因此,我采取了以下措施: class sorter implements Comparator<String> { Map<String, Integer> _referenceMap; public boolean sortDone = false; public sorter(Map<

我需要根据树形图的值对其进行排序。我所做的工作的要求是,我必须使用一个排序的地图。我在这里尝试了解决方案:但是正如评论所说,这将使从我的地图中获取值不起作用。因此,我采取了以下措施:

class sorter implements Comparator<String> {
    Map<String, Integer> _referenceMap;
    public boolean sortDone = false;
    public sorter(Map<String, Integer> referenceMap) {
        _referenceMap = referenceMap;
    }
    public int compare(String a, String b) {
        return sortDone ? a.compareTo(b) : _referenceMap.get(a) >= _referenceMap.get(b) ? -1 : 1;
    }
}
类分类器实现比较器{
地图参考地图;
公共布尔sortDone=false;
公共分拣机(地图参考地图){
_referenceMap=referenceMap;
}
公共整数比较(字符串a、字符串b){
返回sortDone?a.compareTo(b):\u referenceMap.get(a)>=\u referenceMap.get(b)?-1:1;
}
}
所以我将sortDone设置为false,直到我完成了对地图的排序,然后我将sortDone设置为true,这样它就可以正常比较了。问题是,我仍然无法从地图中获取项目。当我执行myMap.get(/anything/)时,它始终还是空的

我也不明白与equals甚至不一致的比较器是什么意思

我也不明白与equals甚至不一致的比较器是什么意思

按照

当且仅当e1.compareTo(e2)==0对于C类的每个e1和e2具有与e1.equals(e2)相同的布尔值时,C类的自然顺序称为与equals一致。请注意,null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(null)也应抛出NullPointerException

强烈建议(尽管不是必需的)自然顺序与equals一致

我认为您需要更改线路:

 _referenceMap.get(a) >= _referenceMap.get(b) ? -1 : 1;


因为如果
\u referenceMap.get(a)
返回的
整数
\u referenceMap.get(b)
返回的
整数
的值实际上是
=
,那么理想情况下,您应该返回
0,而不是
-1

,这意味着您必须实现
等于()
method,用于比较与
compareTo()方法比较的相同字段


重写
hashCode()
方法以返回基于相同字段的哈希也是一种很好的做法。

但是在我的源代码中,我重写equals()的对象是什么?当我执行“sortedData.firstKey()”时,它会给我正确的键,但当我尝试“sortedData.get”(“smetinghere”)时仍然是这样每次都是空的。@Macmee您是如何在
映射中输入值的?你能给我们看一下吗?我正在使用put方法将它们放入我的地图中,只是在一个项目列表(字符串,整数)上迭代,例如sortedData.put(“Ardvark”,1000);分类数据put(“斑马”,99999);地图会自动按键进行自然排序,顺序是Ardvark,然后是Zebra,但是我希望我的树形图按值排序,这样我就有了Zebra,然后是Ardvark。我发布的方法对我的地图进行了很好的排序,我甚至可以打印sortedData.toString()并查看它的排序,但是如果我尝试sortedData.get(“Zebra”),它将返回null。您可以在获取null值的位置添加代码吗?
 _referenceMap.get(a).compareTo(_referenceMap.get(b));