按一个字段排序并在地图中删除另一个字段?

时间:2013-08-20 15:20:10

标签: java collections map tree

假设有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());我想要的是在Map内部,条目仅由keySort排序,并仅基于{{ 1}}

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

编辑:我明白什么是错的;对于替代方案,问题仍然存在。来自NullPointerException JavaDoc:

  

请注意由排序地图维护的排序(无论是否为   提供显式比较器)必须与equals一致   这个有序映射是为了正确实现Map接口。 (看到   可比较或比较器的精确定义与   等于)

1 个答案:

答案 0 :(得分: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

一种解决方案是通过迭代 keyset 中的所有键来实现自己的remove方法 - 搜索removeKey,但是那将用O(n)替换O(1)复杂度)。也许这可能是一种解决方法。