日期:2014-05-20  浏览次数:20703 次

treemap怎么才能remove
我搞了半天准备拿这个来实现功能的, 才发现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造成的影响应该是同等的。
------解决方案--------------------
remove key
------解决方案--------------------
楼主没报出快速失败异常吗。非线程安全的集合你在迭代的同时去删除,自然不行。你要在迭代的同时删除就用entrySet.iterator迭代器去迭代删除。
------解决方案--------------------
你看看TreeMap的remove方法,

它是根据compare方法查找要删除的对像的,你重写的方法中没有==0的情况。永远不相等。