黑马程序员技术交流社区

标题: 集合框架中TreeSet和TreeMap的疑问 [打印本页]

作者: 孙峰    时间: 2012-6-8 17:48
标题: 集合框架中TreeSet和TreeMap的疑问
       Set集合中 TreeSet  在存入元素时,有两种方法可以保证排序:1、让元素具有可比性,元素实现Comparable 接口,覆盖,compareTo方法。2、在TreeSet集合上添加比较器,实现comparator接口,覆盖compare方法。
     但是在TreeMap中,存入元素时是怎么排序的呢?记的笔记说:可以给键排序,麻烦谁给讲解下。
谁有记忆区别List,Set,Map的形象理解吗?
作者: 付信榕    时间: 2012-6-8 20:01
谁有记忆区别List,Set,Map的形象理解吗?
list 目录列表之意,目录有索引,有顺序的,内容可以重复的。(有下标,怎么存就怎么取,可以重复)
set 设置之意,   元素来了,它要“设置”下,按照某种规则安排个顺序,相同的不要。(会被排序而不是原存储顺序,不可以重复)
map 地图之意  地图要有经纬两度才能确定以个点,所以map的元素也是由类似坐标 k(键)=v(值)确定的。
个人的理解
作者: 付信榕    时间: 2012-6-8 20:13
例子讲解

/*
需求:对学生对象的年龄进行升序排序。

因为数据是以键值对形式存在的。
所以要使用可以排序的Map集合。TreeMap。
*/
import java.util.*;

class StuNameComparator implements Comparator<Student>//1、自定比较器StuNameComparator
{
        public int compare(Student s1,Student s2)
        {
                int num = s1.getName().compareTo(s2.getName());
                if(num==0)
                        return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));

                return num;
        }
}


class  MapTest2
{
        public static void main(String[] args)
        {
                TreeMap<Student,String> tm =

new TreeMap<Student,String>(new StuNameComparator());//2、new 对象时传入自定义比较器StuNameComparator

                tm.put(new Student("blisi3",23),"nanjing");
                tm.put(new Student("lisi1",21),"beijing");
                tm.put(new Student("alisi4",24),"wuhan");
                tm.put(new Student("lisi1",21),"tianjin");
                tm.put(new Student("lisi2",22),"shanghai");

//添加的元素就会按照比较器StuNameComparator的规定安排合适位置给它们了

               
                Set<Map.Entry<Student,String>> entrySet = tm.entrySet();

                Iterator<Map.Entry<Student,String>> it = entrySet.iterator();

                while(it.hasNext())
                {
                        Map.Entry<Student,String> me = it.next();

                        Student stu = me.getKey();
                        String addr = me.getValue();
                        System.out.println(stu+":::"+addr);
                }
        }
}



作者: 王月    时间: 2012-6-8 22:07
其实,用map集合中的TreeMap就可以进行自动排序,不知道lz是按键排序还是按值排序。
按键的话,可以用entrySet的方法把所有键值对取出,放入list中,然后用Collections.sort(List list,Comparator comparator)的方法,将list和自定义排序功能的comparator比较器传递进去,就OK了.
这已经很详细了吧,
若想通过值进行排序,就需要用到“比较器”,实现Comparator接口,进行重写“compare”方法,若值是相同的,再比较键值,这样就可以进行值排序了。
所以,就算值相同也没关系。既然lz搞明白了TreeSet,这个排序应该会吧。

作者: 王月    时间: 2012-6-8 22:14
记忆这三个集合,我的记忆方式是:先看需求,有序可重复,就选list。
                                          要排序,不能重复,就选set。
                                          以对应方式出现,即映射,一定想到map。
lz多理解这三位的特点,很容易记住的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2