还是treemap的问题

chichenzhe 2013-02-19 04:43:54
我需要用treemap解决排序问题.
我使用了对象类型的 key. key内有一个关键的int是比较排序的唯一值

但我不能用这个int直接作为 treemap的key. 因为有重复,所以这样才把他放入一个对象封装起来.

现在遇到问题:
get,remove 会失败.
因为我在put完成之后是不可能存储 这些对象的, 我有的只是上面是上面所提到的int值.
用这个int值重新new一个key去get的话会获得NULL.


tree.put(new TreeElement(123, "aii"), 123);
//这是remove失败的情况
tree.remove(new TreeElement(123, "aii"));

//这是我的比较器写法:
@Override
public int compare (TreeElement o1, TreeElement o2) {

System.out.println("--->"+o1.value+"; "+o2.value);
if(o1.value > o2.value) {
return -1;
}
else if(o1.value == o2.value && o1.name.equals(o2.name)) {
// 这里进行返回0的操作非常重要,否则无法remove和containsKey
return 0;
}
else {
return 1;
}
}

据我猜测, 应该是remove的时候他是根据多个条件来判定是否正确移除的.
至少有:1, 对象地址对比; 2,使用传入的compare比较器 等2个条件
我也想到用继承treemap重写 get remove containskey等等方法 但是好像代价很大,而且而已没参考例子,无从下手...

请教大家如何解决?
我就是肯定要用tree.remove(new TreeElement(123, "aii"));的方式移除.
...全文
138 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chichenzhe 2013-02-20
  • 打赏
  • 举报
回复
我后来找到了, 因为treemap是2分算法搞的排序. 我的 return=0的那个if有问题.
龙四 2013-02-19
  • 打赏
  • 举报
回复

import java.util.Comparator;
import java.util.TreeMap;


public class TestTreeMap {

	public static void main(String[] args) {
		TreeMap<TreeElement, Integer> m = new TreeMap<TreeElement, Integer>(new Comparator<TreeElement>() {
			public int compare (TreeElement o1, TreeElement o2) {
				 
                System.out.println("--->"+o1.value+"; "+o2.value);
                if(o1.value > o2.value) {
                    return -1;
                }
                else if(o1.value == o2.value && o1.name.equals(o2.name)) {
                    return 0;
                }
                else {
                    return 1;
                }
            }
			
		});
		m.put(new TreeElement(123, "aii"), 123);
		System.out.println("after add:" + m.size());
		TreeElement k = new TreeElement(123, "aii");
		System.out.println("get:" + m.get(k));
		m.remove(k);
		System.out.println("after remove:" + m.size());
	}
}
class TreeElement {
	public int value;
	public String name;
	public TreeElement(int value, String name) {
		this.value = value;
		this.name = name;
	}
}
木有发现问题
chichenzhe 2013-02-19
  • 打赏
  • 举报
回复
补充一句: 正常用正确的引用对象去remove 和get是没问题的.

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧