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));