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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁錦泰 黑马帝   /  2012-5-21 09:33  /  3536 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

包括按照集合内的具体元素、集合内对象的某个属性排序,请高手给予讲解,越详细越好。
注:为什么Arraylist集合可以使用sort()排序方法。查阅API没有看到直接关系,sort()方法为Arrays特有方法,难道是因为Arraylist底层是数组数据结构就可以用数组的排序方法吗?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

11 个回复

倒序浏览
1.对象本身实现Comparable接口,那么该类的实例就是可以排序的.
只要实现了Comparable接口,就可以调用Collections的sort方法对集合中的元素排序.

2.指定一个Comparator,也就是实现了Comparator的类的一个实例.
但是Java本身只提供了一个Comparator的实现,就是Collections.reverseOrder().
该方法返回的是一个已经实现了Comparable接口的反序.

看一下Comparator的全部内容:

public interface Comparator {
  int compare(Object o1, Object o2);
  boolean equals(Object obj);
}
定义了两个方法,其实我们一般都只需要实现compare方法就行了,因为类都是默认从Object继承
所以会使用Object的equals方法.
Comparator一般都作为一个匿名类出现,对于没有实现Comparable的对象的集合,排序的时候
需要指定一个Comparator.

这里举例说明
对于实现了Comparable的类我们就用最简单的Integer
List list=new ArrayList();
list.add(new Integer(3));
list.add(new Integer(53));
list.add(new Integer(34));
Collections.sort(list);

对于没有实现Comparable的,我们就用Object,按照hashCode大小来排序.
List list= new ArrayList();
list.add(new Object());
list.add(new Object());
list.add(new Object());
Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
                    return (o1.hashCode()-o2.hashCode());
                })



例程:自己写了两个类,根据Comparable接口来实现的

User对象

public class User implements Comparable<User>{
    private String name = "";
    private int age = 0;
    public User(String name,int age){
        this.name = name;
        this.age = age;
    }
    public int compareTo(User anotherUser) {
        return this.age > anotherUser.getAge()? 1:this.age == anotherUser.getAge()?0:-1;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString(){
        return "user name = " + this.name + ", age = " + this.age;
    }
}



排序

public class StringSort  {

    public static void main(String args[]){
        List<User> list = new ArrayList<User>();
        list.add(new User("byron",28));
        list.add(new User("byron1",22));
        list.add(new User("byron2",23));
        list.add(new User("byron3",21));
        list.add(new User("byron4",28));
        Collections.sort(list);
        for(User a:list){
            System.out.println("a = " + a);
        }
    }
}

这样可以完成对象的排序,可根据自己的需要写比较方法

评分

参与人数 1技术分 +2 收起 理由
贠(yun)靖 + 2 赞一个!

查看全部评分

回复 使用道具 举报
麦田里的守望者 发表于 2012-5-21 10:00
1.对象本身实现Comparable接口,那么该类的实例就是可以排序的.
只要实现了Comparable接口,就可以调用Colle ...

第一点好像不对。list集合元素是有角标的,即使元素实现了Comparable接口,也不会自动排序。自动排序是在存入Set集合的情况。

点评

但是如果Collections.sort(list) 就会排序的亲,所以人家说的对着呢  发表于 2012-5-21 12:17
回复 使用道具 举报
确实没有在Arraylist的API里找到sort()方法,其实sort()方法是在Collections工具类里面的。
看到楼主的问题,我的思路是:
1)List集合底层是数组,对集合排序完全可以转为对数组排序,借助list集合中的toArray()方法,将集合转为数组,对数组排序就容易很多了
2)List API中没有直接提供排序方法,可以参照Collections中的方法(Collections是专门操作集合的工具类),用sort(List)方法即可。

至于用比较器这种方法嘛,那好像是TreeSet或者TreeMap才有的,List集合构造方法中,没有可以传递比较器的。

如有不对的地方,还请指正,谢谢。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
用Collections.sort方法对list排序有两种方法:
第一种:
list中的对象实现Comparable接口
第二种:
根据Collections.sort重载方法来实现
回复 使用道具 举报
集合有个工具类java.util.Collections
sort()方法是它里面定义的方法,具体内容请看API
回复 使用道具 举报
袁錦泰 黑马帝 2012-5-21 11:42:20
7#
余宏 发表于 2012-5-21 11:18
用Collections.sort方法对list排序有两种方法:
第一种:
list中的对象实现Comparable接口

十分感谢!!
回复 使用道具 举报
袁錦泰 黑马帝 2012-5-21 11:42:38
8#
赵玮_Tom 发表于 2012-5-21 11:15
确实没有在Arraylist的API里找到sort()方法,其实sort()方法是在Collections工具类里面的。
看到楼主的问题 ...

十分感谢!!
回复 使用道具 举报
袁錦泰 黑马帝 2012-5-21 11:45:17
9#
本帖最后由 袁錦泰 于 2012-5-21 11:55 编辑
赵玮_Tom 发表于 2012-5-21 11:15
确实没有在Arraylist的API里找到sort()方法,其实sort()方法是在Collections工具类里面的。
看到楼主的问题 ...

我在请问一下,有没有Arraylist.sort()这样的写法? 它和那个工具类Collections有什么关系,为什么可以使用Collections的方法?我刚看了一下Collections的API,里面的方法全部是静态,我突然脑子转不过弯,虽然传入的都是集合,但还是想不出它们之间的关系。
回复 使用道具 举报
袁錦泰 发表于 2012-5-21 11:45
我在请问一下,有没有Arraylist.sort()这样的写法? 它和那个工具类Collections有什么关系,为什么可以使 ...

我确实没有在ArrayLis和List的API中找到sort()方法。
Collections是工具类,里面当然全是静态方法喽,那就是一个工具,操作集合的工具,工具有木有:lol,不是集合,别把它和Collecton搞错喽
回复 使用道具 举报
本帖最后由 袁錦泰 于 2012-5-21 12:51 编辑
赵玮_Tom 发表于 2012-5-21 12:42
我确实没有在ArrayLis和List的API中找到sort()方法。
Collections是工具类,里面当然全是静态方法喽,那 ...

我刚刚看到前面那哥们儿的回答,这么说的话只要实现Comparable接口就可以使用它了?
回复 使用道具 举报
麦田里的守望者 发表于 2012-5-21 10:00
1.对象本身实现Comparable接口,那么该类的实例就是可以排序的.
只要实现了Comparable接口,就可以调用Colle ...

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