我需要用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"));的方式移除.

解决方案 »

  1.   

    补充一句:  正常用正确的引用对象去remove 和get是没问题的.
      

  2.   


    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;
    }
    }
    木有发现问题
      

  3.   

    我后来找到了, 因为treemap是2分算法搞的排序.  我的 return=0的那个if有问题.