关于Collections中的sort()方法总结

简介:

用Collections.sort方法对list排序有两种方法

第一种是list中的对象实现Comparable接口,如下:

User.java

复制代码
 1 public class User implements Comparable<User>{
 2     //这个地方的Comparable接口后面一定要跟泛型.否则经常编译错误.
 3     private String name;
 4     private Integer order;
 5     public String getName() {
 6         return name;
 7     }
 8     public void setName(String name) {
 9         this.name = name;
10     }
11     public Integer getOrder() {
12         return order;
13     }
14     public void setOrder(Integer order) {
15         this.order = order;
16     }
17     
18     public int compareTo(User user) {
19         return this.getOrder().compareTo(user.getOrder());
20     }
21 }
复制代码

 

对应的测试类

Test.java

复制代码
 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 import java.util.List;
 4 
 5 public class Test{
 6     public static void main(String[] args) {
 7         User user1 = new User();
 8         user1.setName("a");
 9         user1.setOrder(1);
10         User user2 = new User();
11         user2.setName("b");
12         user2.setOrder(2);
13         List<User> list = new ArrayList<User>();
14         //此处add user2再add user1
15         list.add(user2);
16         list.add(user1);
17         Collections.sort(list);
18         for(User u : list){
19             System.out.println(u.getName());
20         }
21     }
22 }
复制代码

 

输出结果

a
b

第二种方法是根据Collections.sort重载方法来实现,例如:

User.java

复制代码
 1 /**
 2 * 根据order对User排序
 3 */
 4 public class User { //此处无需实现Comparable接口
 5     private String name;
 6     private Integer order;
 7     public String getName() {
 8         return name;
 9     }
10     public void setName(String name) {
11         this.name = name;
12     }
13     public Integer getOrder() {
14         return order;
15     }
16     public void setOrder(Integer order) {
17         this.order = order;
18     }
19 }
复制代码

 

主类中这样写即可:

Test.java

复制代码
 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 import java.util.Comparator;
 4 import java.util.List;
 5 
 6 public class Test2{
 7     public static void main(String[] args) {
 8         User user1 = new User();
 9         user1.setName("a");
10         user1.setOrder(1);
11         User user2 = new User();
12         user2.setName("b");
13         user2.setOrder(2);
14         List<User> list = new ArrayList<User>();
15         list.add(user2);
16         list.add(user1);
17          
18         Collections.sort(list,new Comparator<User>(){
19             public int compare(User user1, User user2) {
20                 return user1.getOrder().compareTo(user2.getOrder());
21             }
22         });
23         for(User u : list){
24             System.out.println(u.getName());
25         }
26     }
27 }
复制代码

 

输出结果

a
b

前者代码结构简单,但是只能根据固定的属性排序,后者灵活,可以临时指定排序项,但是代码不够简洁

多字段的场合: 

复制代码
Collections.sort(list,new Comparator(){
    public int compare(User arg0, User arg1) {
//            第一次比较专业
        int i = arg0.getOrder().compareTo(arg1.getOrder());

//    如果专业相同则进行第二次比较
    if(i==0){
//        第二次比较
        int j=arg0.getXXX().compareTo(arg1.getXXX());
//        如果学制相同则返回按年龄排序
        if(j==0){
            return arg0.getCCC().compareTo(arg1.getCCC());
        }
        return j;
    }
    return i;
    }
});
复制代码

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

例子二:

复制代码
 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 import java.util.Comparator;
 4 import java.util.List;
 5 
 6 public class CollectionSortTest {
 7     public static void main(String[] args) {
 8         List<String> lists = new ArrayList<String>();
 9         lists.add("5");
10         lists.add("2");
11         lists.add("9");
12         // lists中的对象String 本身含有compareTo方法,所以可以直接调用sort方法,按自然顺序排序,即升序排序
13         Collections.sort(lists);
14         System.out.println(lists);
15 
16         List<A> list = new ArrayList<A>();
17         A aa = new A();
18         aa.setName("aa");
19         aa.setOrder(1);
20         A bb = new A();
21         bb.setName("bb");
22         bb.setOrder(2);
23         list.add(bb);
24         list.add(aa);
25         // list中的对象A实现Comparable接口
26         Collections.sort(list);
27         System.out.println(list);
28 
29         List<B> listB = new ArrayList<B>();
30         B ab = new B();
31         ab.setName("ab");
32         ab.setOrder("1");
33         B ba = new B();
34         ba.setName("ba");
35         ba.setOrder("2");
36         listB.add(ba);
37         listB.add(ab);
38         // 根据Collections.sort重载方法来实现
39         Collections.sort(listB, new Comparator<B>() {
40             @Override
41             public int compare(B b1, B b2) {
42                 return b1.getOrder().compareTo(b2.getOrder());
43             }
44         });
45 
46         System.out.println(listB);
47     }
48 }
49 
50 class A implements Comparable<A> {
51     private String name;
52     private Integer order;
53     public String getName() {
54         return name;
55     }
56     public void setName(String name) {
57         this.name = name;
58     }
59     public Integer getOrder() {
60         return order;
61     }
62     public void setOrder(Integer order) {
63         this.order = order;
64     }
65     @Override
66     public String toString() {
67         return "name is " + name + " order is " + order;
68     }
69     @Override
70     public int compareTo(A a) {
71         return this.order.compareTo(a.getOrder());
72     }
73 }
74 class B {
75     private String name;
76     private String order;
77     public String getName() {
78         return name;
79     }
80     public void setName(String name) {
81         this.name = name;
82     }
83     public String getOrder() {
84         return order;
85     }
86     public void setOrder(String order) {
87         this.order = order;
88     }
89     @Override
90     public String toString() {
91         return "name is " + name + " order is " + order;
92     }
93 }
复制代码

打印结果:

[2, 5, 9]
[name is aa order is 1, name is bb order is 2]
[name is ab order is 1, name is ba order is 2]

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4284865.html,如需转载请自行联系原作者

相关文章
Java-Arrays.sort()方法的比较器
Arrays.sort()有以下重载(此处只展示两种): Arrays.sort(Object[] a); Arrays.sort(T[] a, Comparator<? super T> c); Arrays.sort(Object[] a) 此方法看似没有要求我们实现比较器,对于基本数据类型,String类型确实如此,因为这些类型中已经自带了compareTo()方法
|
5月前
集合专题----Collections篇
集合专题----Collections篇
|
6月前
|
Java
Map集合详解及Collections方法和Arrays方法
Map集合详解及Collections方法和Arrays方法
39 0
|
7月前
|
定位技术
Collections.singletonMap()用法
Collections.singletonMap()用法
57 0
|
8月前
|
Java
JAVA8学习之Lambada排序与list.sort匿名内部类排序
JAVA8学习之Lambada排序与list.sort匿名内部类排序
96 0
|
设计模式 搜索推荐 算法
JDK中的排序:Arrays.sort的源码实现
JDK中的排序:Arrays.sort的源码实现
422 0
JDK中的排序:Arrays.sort的源码实现
|
存储 算法 安全
Java:Collections.sort和Arrays.sort的区别
Java:Collections.sort和Arrays.sort的区别
171 0
|
存储 安全 Java
Collection 和 Collections;Array与Arrays的区别
<h2>Collection 和 Collections的区别。</h2> <p>Collection是个java.util下的接口,它是各种集合结构的父接口。继承与他的接口主要有Set 和List.</p> <p>Collections是个java.util下的专用静态类,它包含有各种有关集合操作的静态方法。提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。</p>
1809 0
|
存储 XML 安全
collections集合的总结
突然遇到集合的有关面试题,感觉很懵逼,所以特意总结了一下,关于我们常用的 ArrayList、LinkedList、Set等集合的一些区别和用法。
86 0