黑马程序员技术交流社区
标题:
关于TreeMap 中的排序问题。
[打印本页]
作者:
张绍成
时间:
2011-12-28 17:45
标题:
关于TreeMap 中的排序问题。
本帖最后由 张绍成 于 2011-12-28 19:52 编辑
TreeMap 中的Key 值 是自动排序的吗?是添加一个就排一次的吗?按照什么规律?要是自定义应该怎么定义?
HsahMap 中的Key 值 可以排训吗?怎么排?
作者:
曾运
时间:
2011-12-28 18:51
本帖最后由 曾运 于 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
本帖最后由 曾运 于 2011-12-28 19:10 编辑
import java.util.*;
public class HashMapDemo
{
public static void main(String[] args)
{
HashMap<String, String> map=new HashMap<String, String>();
map.put("1", "11111");
map.put("4", "44444");
map.put("3", "33333");
map.put("2", "22222");
map.put("5", "55555");
//遍历集合的内容
for(Map.Entry<String,String> me:map.entrySet())
{
System.out.println(me.getKey()+"--->"+me.getValue());
}
}
}
复制代码
以上代码输出结果是Key是无序的
HashMap自定义类的key 如何排序:
import java.util.*;
public class TreeMapDemo
{
public static void main(String[] args)
{
TreeMap<Person,String> map=new TreeMap<Person, String>();
map.put(new Person("tom",20), "美国佬");
map.put(new Person("lily",15), "英国妞");
map.put(new Person("lulu",10), "日本女");
map.put(new Person("rose",18), "德国mm");
//遍历集合的内容
for(Map.Entry<Person,String> me:map.entrySet())
{
System.out.println(me.getKey()+"--->"+me.getValue());
}
}
}
/*
* 自定义类可以实现Comparable接口让对象具有比较性,从而达到排序的目的
另外还可以自定义外部比较器,即实现Comparator接口,
然后将比较器通过TreeMap的构造函数传入,让集合具有比较性,从而达到排序目的。
*/
class Person implements Comparable<Person>
{
String name;
int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String toString()//重写toString 方法
{
return "姓名:"+this.name+" 年龄:"+this.age;
}
//按照年龄进行排序
public int compareTo(Person p)
{
if(this.age>p.age)
return 1;
if(this.age<p.age)
return -1;
return 0;
}
}
复制代码
输出结果:(按key中的年龄排序)
姓名:lulu 年龄:10--->日本女
姓名:lily 年龄:15--->英国妞
姓名:rose 年龄:18--->德国mm
姓名:tom 年龄:20--->美国佬
TreeMap中如果key是包装类或者String类会自动进行key排序(包装类或者String类的对象都有比较性)
import java.util.*;
public class TreeMapDemo11
{
public static void main(String[] args)
{
TreeMap<Integer,String> map=new TreeMap<Integer, String>();
map.put(2, "222");
map.put(5, "555");
map.put(3, "333");
map.put(4, "444");
map.put(1, "111");
//遍历结合的内容
for (Map.Entry<Integer, String> me:map.entrySet())
{
System.out.println(me.getKey()+"--->"+me.getValue());
}
/*
输出结果: (KEY自动进行排序)
1--->111
2--->222
3--->333
4--->444
5--->555
*/
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2