带有自定义比较器的 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 来确定相等性。