A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李会成 中级黑马   /  2013-2-20 16:29  /  1228 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我需要用treemap解决排序问题.
我使用了对象类型的 key.  key内有一个关键的int是比较排序的唯一值

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

现在遇到问题:
get,remove 会失败.
因为我在put完成之后是不可能存储 这些对象的, 我有的只是上面是上面所提到的int值.
用这个int值重新new一个key去get的话会获得NULL.
  1. ree.put(new TreeElement(123, "aii"), 123);
  2. //这是remove失败的情况
  3. tree.remove(new TreeElement(123, "aii"));

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

  7.                                 System.out.println("--->"+o1.value+"; "+o2.value);
  8.                                 if(o1.value > o2.value) {
  9.                                         return -1;
  10.                                 }
  11.                                 else if(o1.value == o2.value && o1.name.equals(o2.name)) {
  12.                                         // 这里进行返回0的操作非常重要,否则无法remove和containsKey
  13.                                         return 0;
  14.                                 }
  15.                                 else {
  16.                                         return 1;
  17.                                 }
  18.                         }
复制代码
据我猜测, 应该是remove的时候他是根据多个条件来判定是否正确移除的.
至少有:1, 对象地址对比; 2,使用传入的compare比较器 等2个条件
我也想到用继承treemap重写 get remove containskey等等方法 但是好像代价很大,而且而已没参考例子,无从下手...

请教大家如何解决?
我就是肯定要用tree.remove(new TreeElement(123, "aii"));的方式移除.

3 个回复

倒序浏览
public class TreeMapDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Map<TreeElement,Integer> map = new TreeMap<TreeElement,Integer>();
                map.put(new TreeElement("lisi",100), 1);
                map.put(new TreeElement("ahangsan",100), 3);
                map.put(new TreeElement("wangwu",100), 2);
                map.put(new TreeElement("wangwu",101), 3);
                map.put(new TreeElement("zhaoli",100), 4);
               
                System.out.println(map.remove(new TreeElement("zhaoli",100)));
                System.out.println(map.get(new TreeElement("wangwu",100)));
                Set<TreeElement> set = map.keySet();
               
                Iterator<TreeElement> it =set.iterator();
                while(it.hasNext())
                {
                        TreeElement te = it.next();
                        Integer value = map.get(te);
                        System.out.println(te+"----"+value);
                }       
        }

}
class TreeElement implements Comparable
{
        String name;
        public String getName() {
                return name;
        }
        public int getId() {
                return id;
        }
        int id;
        TreeElement(String name,int id)
        {
                this.name = name ;
                this.id = id;
        }
        @Override
        public int compareTo(Object o) {
                if(!(o instanceof TreeElement))
                        throw new RuntimeException("类型不匹配");
                TreeElement tree = (TreeElement)o;
                int num =this.name.compareTo(tree.name);
                //System.out.println(this.name+"---compareTo---"+tree.name);
                if(num==0)
                {
                        return new Integer(this.id).compareTo(new Integer(tree.id));
                }
                return num;
        }
        public String toString()
        {
                return name+":"+id;
        }
}
这样写看行不行
反正我是可以删除和获取
回复 使用道具 举报
我就按照你的描述做的,没有问题的,跟你的代码一样,不信你看:
{:soso_e123:}
  1. import java.util.Comparator;
  2. import java.util.TreeMap;

  3. public class TreeMapTest
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 TreeMap<TreeElement, Integer> tree = new TreeMap<TreeElement, Integer>(
  8.                                 new Comparator<TreeElement>()
  9.                                 {
  10.                                         public int compare(TreeElement o1, TreeElement o2)
  11.                                         {
  12.                                                 System.out.println("--->" + o1.value + "; " + o2.value);

  13.                                                 if (o1.value > o2.value)
  14.                                                 {
  15.                                                         return -1;
  16.                                                 }

  17.                                                 else if (o1.value == o2.value
  18.                                                                 && o1.name.equals(o2.name))
  19.                                                 {
  20.                                                         // 这里进行返回0的操作非常重要,否则无法remove和containsKey
  21.                                                         return 0;
  22.                                                 }
  23.                                                 else
  24.                                                 {
  25.                                                         return 1;
  26.                                                 }
  27.                                         };
  28.                                 });
  29.                
  30.                 tree.put(new TreeElement(123, "aii"), 123);
  31.                 System.out.println(tree.get(new TreeElement(123, "aii")));//返回对应的value
  32.                 System.out.println(tree.remove(new TreeElement(123, "aii")));//返回所删除key对应的value
  33.         }
  34. }

  35. class TreeElement
  36. {
  37.         int value;
  38.         String name;

  39.         public TreeElement(int value, String str)
  40.         {
  41.                 this.value = value;
  42.                 this.name = str;
  43.         }

  44. }

  45. /**
  46. * 最后打印
  47. * --->123;123
  48. *123
  49. * --->123;123
  50. *123
  51. */
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马