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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张绍成 黑马帝   /  2011-12-28 17:45  /  2433 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张绍成 于 2011-12-28 19:52 编辑

TreeMap   中的Key 值 是自动排序的吗?是添加一个就排一次的吗?按照什么规律?要是自定义应该怎么定义?
HsahMap  中的Key 值 可以排训吗?怎么排?

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

2 个回复

倒序浏览
曾运 黑马帝 2011-12-28 18:51:24
沙发
本帖最后由 曾运 于 2011-12-28 22:07 编辑

1.HashMap<key,value> 如果key 是包装类(Integer Double等)类型或者String类型 由于包装类和String类的对象本身具有比较性,添加到TreeMap里会自动排序,每添加一个排序一个。

2 为什么能对key进行排序呢,这个与TreeMap集合的数据存储结构有关,TreeMap是采用二叉树的数据存储结构的,每添加一个元素,就比较一下,被添加的元素如果小于该元素,添加到该元素的左子树,反之则添加到右子树。对二叉树进行遍历的时候,采用中序遍历,就得到了有序的元素集合。

3.自定义类要让TreeMap的key能进行排序 要么让key的对象具有比较性(实现Comparable接口让对象具有比较性),要么让集合具有比较性(定义外部比较器,即实现Comparator接口,然后将比较器通过TreeMap的构造函数传入,让集合具有比较性,从而达到排序目的。)  详细见代码。。。

4.HashMap 不会对Key进行排序的,这是因为HashMap 采用的哈希存储结构。
回复 使用道具 举报
曾运 黑马帝 2011-12-28 18:58:00
藤椅
本帖最后由 曾运 于 2011-12-28 19:10 编辑
  1. import java.util.*;
  2. public class HashMapDemo
  3. {


  4.         public static void main(String[] args)
  5.         {
  6.                 HashMap<String, String> map=new HashMap<String, String>();
  7.                 map.put("1", "11111");
  8.                 map.put("4", "44444");
  9.                 map.put("3", "33333");
  10.                 map.put("2", "22222");
  11.                 map.put("5", "55555");
  12.                 //遍历集合的内容
  13.                 for(Map.Entry<String,String> me:map.entrySet())
  14.                 {
  15.                         System.out.println(me.getKey()+"--->"+me.getValue());
  16.                 }

  17.         }

  18. }
复制代码
以上代码输出结果是Key是无序的

HashMap自定义类的key 如何排序:
  1. import java.util.*;
  2. public class TreeMapDemo
  3. {

  4.        
  5.         public static void main(String[] args)
  6.         {
  7.        
  8.                 TreeMap<Person,String> map=new TreeMap<Person, String>();
  9.        
  10.                

  11.                
  12.                 map.put(new Person("tom",20), "美国佬");
  13.                 map.put(new Person("lily",15), "英国妞");
  14.                 map.put(new Person("lulu",10), "日本女");
  15.                 map.put(new Person("rose",18), "德国mm");

  16.                
  17.                
  18.                
  19.                 //遍历集合的内容
  20.                 for(Map.Entry<Person,String> me:map.entrySet())
  21.                 {
  22.                         System.out.println(me.getKey()+"--->"+me.getValue());
  23.                 }

  24.         }

  25. }

  26. /*
  27. * 自定义类可以实现Comparable接口让对象具有比较性,从而达到排序的目的
  28. 另外还可以自定义外部比较器,即实现Comparator接口,
  29. 然后将比较器通过TreeMap的构造函数传入,让集合具有比较性,从而达到排序目的。
  30. */
  31. class Person implements Comparable<Person>
  32. {
  33.         String name;
  34.         int age;
  35.         Person(String name,int age)
  36.         {
  37.                 this.name=name;
  38.                 this.age=age;
  39.         }
  40.        
  41.         public String toString()//重写toString 方法
  42.         {
  43.                 return "姓名:"+this.name+" 年龄:"+this.age;
  44.         }

  45.     //按照年龄进行排序
  46.         public int compareTo(Person p)
  47.         {
  48.                 if(this.age>p.age)
  49.                         return 1;
  50.                 if(this.age<p.age)
  51.                         return -1;
  52.                 return 0;
  53.         }

  54. }
复制代码
输出结果:(按key中的年龄排序)

姓名:lulu 年龄:10--->日本女
姓名:lily 年龄:15--->英国妞
姓名:rose 年龄:18--->德国mm
姓名:tom 年龄:20--->美国佬



TreeMap中如果key是包装类或者String类会自动进行key排序(包装类或者String类的对象都有比较性)
  1. import java.util.*;
  2. public class TreeMapDemo11
  3. {


  4.         public static void main(String[] args)
  5.         {
  6.           TreeMap<Integer,String> map=new TreeMap<Integer, String>();
  7.           
  8.           map.put(2, "222");
  9.           map.put(5, "555");
  10.           map.put(3, "333");
  11.           map.put(4, "444");
  12.           map.put(1, "111");
  13.           
  14.           //遍历结合的内容
  15.           for (Map.Entry<Integer, String> me:map.entrySet())
  16.                 {
  17.                   System.out.println(me.getKey()+"--->"+me.getValue());
  18.                 }
  19.           
  20.           /*
  21.            输出结果: (KEY自动进行排序)
  22.             1--->111
  23.                 2--->222
  24.                 3--->333
  25.                 4--->444
  26.                 5--->555
  27.           */
  28.         }

  29. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
吴上储 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马