Java 在地图中,按一个字段排序并按另一个字段删除元素?
假设存在Java 在地图中,按一个字段排序并按另一个字段删除元素?,java,collections,map,tree,Java,Collections,Map,Tree,假设存在NavigableMap,其中键将是: class Key { private String keySort; private String keyRemove; //getters, setters etc. @Override public boolean equals(Object o) { //only include keyRemove } @Override public int hashC
NavigableMap
,其中键将是:
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());
}
}
类SortComparator实现Comparator{
@凌驾
公共整数比较(键o1,键o2){
返回o1.getKeySort().compareTo(o2.getKeySort());
}
}
现在映射实例化如下所示:NavigableMap myMap=newtreemap(new-SortComparator())
我想要的是在地图中包含仅按键排序的条目,并仅根据keyRemove
删除它们
问题是,当我试图从映射中删除元素时,只有keyRemove
值,它不能按预期工作(NullPointerException
在Comparator中)。如何修复上述实现以使用预期行为,或者如何以其他方式实现预期行为
编辑:我知道怎么了;问题仍然存在,寻找替代方案。从TreeMap
JavaDoc:
请注意,排序由排序映射维护(无论是否为
如果提供了显式比较器,则必须与equals一致
此排序映射用于正确实现映射接口。(见
可比比较器,用于精确定义符合
相等。)
我认为,当您要删除映射中的条目时,remove方法将基于equals方法执行此操作:
(key==null?k==null:key.equals(k))
就像这里描述的
一种解决方案是通过迭代键集中的所有键来实现自己的remove方法——搜索removeKey,但这将用O(n)替换O(1)复杂性。也许这对你来说是个解决办法