0

假设在NavigableMap<Key, Value>哪里Key

class Key {
    private String keySort;
    private String keyRemove;

    //getters, setters etc.

    @Override
    public boolean equals(Object o) {
        //only include keyRemove
    }

    @Override
    public int hashCode() {
        //only include keyRemove
    }
}

还有一个比较器:

class SortComparator implements Comparator<Key> {
    @Override
    public int compare(Key o1, Key o2) {
        return o1.getKeySort().compareTo(o2.getKeySort());
    }    
}

现在地图实例化看起来像这样:NavigableMap<Key, Value> myMap = new TreeMap<>(new SortComparator());我想要的是在地图内部,条目仅按 排序,keySort并且仅基于keyRemove.

问题是当我尝试从地图中删除元素时,只有keyRemove值,它不能按预期工作(NullPointerException在比较器中)。如何修复上述实现以使用预期的行为,或者如何以其他方式实现预期的行为?

编辑:我明白出了什么问题;对于替代方案,问题仍然存在。来自TreeMapJavaDoc:

请注意,如果该排序映射要正确实现 Map 接口,则排序映射维护的排序(无论是否提供显式比较器)必须与 equals 一致。(有关与等于一致的精确定义,请参见 Comparable 或 Comparator。)

4

1 回答 1

1

我在想,当您想删除地图中的条目时,remove方法将基于equals方法完成工作: (key==null ? k==null : key.equals(k)) 就像这里描述的http://docs.oracle.com/javase/6/docs/api/java /util/AbstractMap.html#remove%28java.lang.Object%29

一种解决方案是通过迭代密钥集中的所有密钥来实现您自己的删除方法- 搜索 removeKey,但这将用 O(n) 替换 O(1) 复杂度也许这对您来说是一种解决方法。

于 2013-08-20T15:29:53.190 回答