带有自定义比较器的 TreeMap 不会删除条目
TreeMap with custom comparator doesn't remove entries
所以我有一个 TreeMap
带有一个简单的自定义比较器,它根据地图的值对地图进行排序。
Map<Integer, Double> unsortedMap = new HashMap<Integer, Double>();
unsortedMap.put(..,..)
...
...
Map<Integer, Double> map = new TreeMap<Integer, Double>(new SortValues(unsortedMap));
public class SortValues implements Comparator<Integer> {
Map<Integer, Double> map;
SortValues(Map<Integer, Double> map) {
this.map = map;
}
@Override
public int compare(Integer one, Integer two) {
if(map.get(one) >= map.get(two)) {
return 1;
} else
return -1;
}
}
}
我把地图打印出来了,看起来不错。但是当我执行 map.remove(key)
时,它不会删除它,因为当我打印它时我仍然在那里看到它。我在这里错过了什么?
您对 compare
方法的实施违反了合同。如果两个对象相等,则应该 return 0
。这就是它不起作用的原因。
您的 compare
方法有缺陷,因为它不能 return 0
。如果两个对象都是equal
,那么就需要return0
,而不是1
.
如果两个 Integer
相等,请将您的 compare
方法更改为 return 0
。
这将允许 TreeMap
找到 Integer
,它依赖于 compare
returning 0
来确定相等性。
所以我有一个 TreeMap
带有一个简单的自定义比较器,它根据地图的值对地图进行排序。
Map<Integer, Double> unsortedMap = new HashMap<Integer, Double>();
unsortedMap.put(..,..)
...
...
Map<Integer, Double> map = new TreeMap<Integer, Double>(new SortValues(unsortedMap));
public class SortValues implements Comparator<Integer> {
Map<Integer, Double> map;
SortValues(Map<Integer, Double> map) {
this.map = map;
}
@Override
public int compare(Integer one, Integer two) {
if(map.get(one) >= map.get(two)) {
return 1;
} else
return -1;
}
}
}
我把地图打印出来了,看起来不错。但是当我执行 map.remove(key)
时,它不会删除它,因为当我打印它时我仍然在那里看到它。我在这里错过了什么?
您对 compare
方法的实施违反了合同。如果两个对象相等,则应该 return 0
。这就是它不起作用的原因。
您的 compare
方法有缺陷,因为它不能 return 0
。如果两个对象都是equal
,那么就需要return0
,而不是1
.
如果两个 Integer
相等,请将您的 compare
方法更改为 return 0
。
这将允许 TreeMap
找到 Integer
,它依赖于 compare
returning 0
来确定相等性。