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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙峰 黑马帝   /  2012-6-8 17:48  /  2319 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

       Set集合中 TreeSet  在存入元素时,有两种方法可以保证排序:1、让元素具有可比性,元素实现Comparable 接口,覆盖,compareTo方法。2、在TreeSet集合上添加比较器,实现comparator接口,覆盖compare方法。
     但是在TreeMap中,存入元素时是怎么排序的呢?记的笔记说:可以给键排序,麻烦谁给讲解下。
谁有记忆区别List,Set,Map的形象理解吗?

4 个回复

倒序浏览
谁有记忆区别List,Set,Map的形象理解吗?
list 目录列表之意,目录有索引,有顺序的,内容可以重复的。(有下标,怎么存就怎么取,可以重复)
set 设置之意,   元素来了,它要“设置”下,按照某种规则安排个顺序,相同的不要。(会被排序而不是原存储顺序,不可以重复)
map 地图之意  地图要有经纬两度才能确定以个点,所以map的元素也是由类似坐标 k(键)=v(值)确定的。
个人的理解
回复 使用道具 举报
例子讲解

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

因为数据是以键值对形式存在的。
所以要使用可以排序的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);
                }
        }
}


评分

参与人数 1黑马币 +20 收起 理由
孙峰 + 20 很给力!

查看全部评分

回复 使用道具 举报
其实,用map集合中的TreeMap就可以进行自动排序,不知道lz是按键排序还是按值排序。
按键的话,可以用entrySet的方法把所有键值对取出,放入list中,然后用Collections.sort(List list,Comparator comparator)的方法,将list和自定义排序功能的comparator比较器传递进去,就OK了.
这已经很详细了吧,
若想通过值进行排序,就需要用到“比较器”,实现Comparator接口,进行重写“compare”方法,若值是相同的,再比较键值,这样就可以进行值排序了。
所以,就算值相同也没关系。既然lz搞明白了TreeSet,这个排序应该会吧。
回复 使用道具 举报
记忆这三个集合,我的记忆方式是:先看需求,有序可重复,就选list。
                                          要排序,不能重复,就选set。
                                          以对应方式出现,即映射,一定想到map。
lz多理解这三位的特点,很容易记住的。

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
职业规划-刘倩老师 + 1 赞一个!
孙峰 + 10 谢谢

查看全部评分

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