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

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

------解决方案--------------------

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) {