我搞了半天准备拿这个来实现功能的, 才发现remove全失败
见代码:
private static TreeMap<TreeElement, Integer> sortTreeMap (Map<TreeElement, Integer> tree) {
//TreeElement自行写个class即可, 只有一个Int,一个string
Comparator<TreeElement> co = new Comparator<TreeElement>() {
@Override
public int compare (TreeElement o1, TreeElement o2) {
if(o1.value >= o2.value) {
return -1;
}
else {
return 1;
}
}
};
TreeMap<TreeElement, Integer> ret = new TreeMap<TreeElement, Integer>(co);
for (Entry<TreeElement, Integer> ele : tree.entrySet()) {
ret.put(ele.getKey(), ele.getValue());
ret.remove(ele.getKey());
}
for (Entry<TreeElement, Integer> ele : ret.entrySet()) {
System.out.println(">>>>>" + ele.getKey().name + ";value="+ele.getValue());
}
return ret;
}
很奇怪啊....
为什么呢,我得怎么才能做到remove?
其实我 就是想实现当某个元素的TreeElement.value修改了之后不用再调一次sortTreeMap
这调用一次可是全局 for, 效率这么低.
如果直接put的话他是 b-tree排序插入的.
删除不也是修改的一种吗,只不过是一种极端形态而已,对整个TreeMap造成的影响应该是同等的。楼主没报出快速失败异常吗。非线程安全的集合你在迭代的同时去删除,自然不行。你要在迭代的同时删除就用entrySet.iterator迭代器去迭代删除。你看看TreeMap的remove方法,
它是根据compare方法查找要删除的对像的,你重写的方法中没有==0的情况。永远不相等。remove key