假设在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
并仅基于进行删除keyRemove
。
问题是,当我尝试从地图中删除仅具有keyRemove
值的元素时,它无法按预期方式工作(NullPointerException
在Comparator中)。为了实现预期的行为,如何固定上述实现,否则如何实现预期的行为?
编辑:我知道出了什么问题;对于替代方案,问题仍然存在。从TreeMap
JavaDoc:
请注意,如果排序后的映射要正确实现Map接口,则排序后的映射(无论是否提供显式比较器)所维护的顺序必须与equals一致。(有关“等于”的精确定义,请参见“比较器”或“比较器”。)
我在想,当您要删除地图中的条目时,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。
一个解决办法是通过迭代通过在所有钥匙,实现自己的remove方法键集-搜索的removeKey,而是将更换O(1)复杂度为O(n)。也许这对您来说是一种解决方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句