| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1037 人关注过本帖
标题:自己总结了一下集合对对象的排序问题
取消只看楼主 加入收藏
xudongcsharp
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:129
专家分:156
注 册:2009-5-31
结帖率:53.33%
收藏
已结贴  问题点数:20 回复次数:2 
自己总结了一下集合对对象的排序问题
最近在学Oracle,时间上还是挺充足的,所以今天复习了一下J2SE的内容。

关于集合Collection接口里的实现类里对对象的排序问题研究了一下,

TreeSet是实现Set这个接口的一个实现类,除了这个接口他还实现了SortedSet这个接口,

它使用红黑树结构来对加入的 对象进行自然排序。看下面这个例子:

import java.util.*;
public class TreeSetDemo {
    public static void main(String[] args) {
        Set set = new TreeSet();
        set.add("justin");
        set.add("caterpillar");
        set.add("momor");
        set.add("justin");
        Iterator iterator = set.iterator();
        while(iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();
    }
}

输出结果会按字典里的顺序进行排序caterpillar  justin momor

现在讲我们如果声明一个类,按照类的某个属性进行排序(eg:Student类,age属性进行排序),我总结了 有两种方法可以实现,下面一一介绍:

第一种:由于TreeSet的构造器中有一个public TreeSet(Comparator<? super E> comparator)构造一个新的空 TreeSet,它根据指定比较器进行排序。这样说下去可能会有点模糊,下面举个例子:

TreeSet对对象排序
 class Student implements Comparator
 {
     private int id;
     private String name;
     private String sex;
     private int age;
     
     public Student()
     {
         
     }
     public Student(int id,String name,String sex,int age)
     {
         this.id=id;
         this.name=name;
         this.sex=sex;
         this.age=age;
     }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
   
    @Override
    public int compare(Object o1, Object o2) {
        return ((Student)o1).getAge()-((Student)o2).getAge();
    }
   
    //重写toString方法
    public String toString()
    {
        return "id:"+id+" name:"+name+" age:"+age+" sex"+sex;
    }
   
    public static void main(String[] args) {
        Student s = new Student();
        TreeSet<Student> ts=new TreeSet<Student>(s);
        ts.add(new Student(01,"Tom","man",18));
        ts.add(new Student(02,"Austin","man",15));
        ts.add(new Student(03,"Lily","woman",21));
        ts.add(new Student(04,"Emily","man",20));
        Iterator it=ts.iterator();
        while(it.hasNext())
        {
            System.out.println(((Student)it.next()));
        }
    }
 }
这 个类实现了Comparator接口,固添加到TreeSet里得对象都会按照我们写的compare()方法去排序。

第二种方法:由于 JDK为集合提供一个Collections类,他就是返回 collection 的静态方法组成,

里面定义了许多方法操作集合类,而且 这些方法都是静态的!我们注意到里面也有我们想要的sort()方法,只不过给定的参数是List接口的实现类,我们应该想到效率高一些的 ArrayList,由于他是不同步的所以要比Vector效率高一些,一样,我们举个例子看看:

 class Student implements Comparable
 {
     private int id;
     private String name;
     private String sex;
     private int age;
     
     public Student(int id,String name,String sex,int age)
     {
         this.id=id;
         this.name=name;
         this.sex=sex;
         this.age=age;
     }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
   
    @Override
    public int compareTo(Object o) {
        return ((Student)o).getAge()-this.age;
    }
   
    //重写toString方法
    public String toString()
    {
        return "id:"+id+" name:"+name+" age:"+age+" sex"+sex;
    }
   
    public static void main(String[] args) {
        ArrayList<Student> al=new ArrayList<Student>();
        al.add(new Student(01,"Tom","man",18));
        al.add(new Student(02,"Austin","man",15));
        al.add(new Student(03,"Lily","woman",21));
        al.add(new Student(04,"Emily","man",20));

        Collections.sort(al);
        Iterator it=al.iterator();
        while(it.hasNext())
        {
            System.out.println(((Student)it.next()));
        }
    }
 }

明白了吧?很简单就实现了对象的排序!
集合类应该在J2SE里算是重点,以后项目 中应该经常用到,其实他和数组差不多,只不过数组用来存放相同类型的元素,而集合可以存放不同的数据类型,我们也可以通过泛型规定他的类型,这样操作起来 就不用在转换了!
小弟刚刚学习JAVA,有什么不对的地方望指教!
搜索更多相关主题的帖子: 对象 
2010-05-10 19:04
xudongcsharp
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:129
专家分:156
注 册:2009-5-31
收藏
得分:0 
谢谢上面的版主,自己在顶下!
2010-05-12 18:02
xudongcsharp
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:129
专家分:156
注 册:2009-5-31
收藏
得分:0 
回复 5楼 dadongzicool
不错的帖子,谢谢版主分享,受教了!
2010-05-20 18:16
快速回复:自己总结了一下集合对对象的排序问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020902 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved