假设有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接口。 (看到 可比较或比较器的精确定义与 等于)
答案 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)复杂度)。也许这可能是一种解决方法。