Java中List的排序 Comparable和 Compartor

来源:互联网 发布:html标签id使用js变量 编辑:程序博客网 时间:2024/06/05 19:16

第一种方法,就是list中对象实现Comparable接口,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
publicclass Person implementsComparable<Person> {
    privateString name;
    privateInteger order;
  
    /**
     * @return the name
     */
    publicString getName() {
        returnname;
    }
  
    /**
     * @param name
     *            the name to set
     */
    publicvoid setName(String name) {
        this.name = name;
    }
  
    /**
     * @return the order
     */
    publicInteger getOrder() {
        returnorder;
    }
  
    /**
     * @param order
     *            the order to set
     */
    publicvoid setOrder(Integer order) {
        this.order = order;
    }
  
    @Override
    publicint compareTo(Person arg0) {
        returnthis.getOrder().compareTo(arg0.getOrder());
    }
  
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
publicstatic void main(String[] args) {
    List<Person> listA =new ArrayList<Person>();
    Person p1 =new Person();
    Person p2 =new Person();
    Person p3 =new Person();
 
    p1.setName("name1");
    p1.setOrder(1);
    p2.setName("name2");
    p2.setOrder(2);
    p3.setName("name3");
    p3.setOrder(3);
 
    listA.add(p2);
    listA.add(p1);
    listA.add(p3);
    Collections.sort(listA);
    for(Person p : listA) {
        System.out.println(p.getName());
    }
}

第二种方法,就是在重载Collections.sort方法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
publicclass Person {
    privateString name;
    privateInteger order;
  
    /**
     * @return the name
     */
    publicString getName() {
        returnname;
    }
  
    /**
     * @param name
     *            the name to set
     */
    publicvoid setName(String name) {
        this.name = name;
    }
  
    /**
     * @return the order
     */
    publicInteger getOrder() {
        returnorder;
    }
  
    /**
     * @param order
     *            the order to set
     */
    publicvoid setOrder(Integer order) {
        this.order = order;
    }
  
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
publicstatic void main(String[] args) {
        List<Person> listA =new ArrayList<Person>();
        Person p1 =new Person();
        Person p2 =new Person();
        Person p3 =new Person();
  
        p1.setName("name1");
        p1.setOrder(1);
        p2.setName("name2");
        p2.setOrder(2);
        p3.setName("name3");
        p3.setOrder(3);
  
        listA.add(p2);
        listA.add(p1);
        listA.add(p3);
          
        Collections.sort(listA,new Comparator<Person>() {
            publicint compare(Person arg0, Person arg1) {
                returnarg0.getOrder().compareTo(arg1.getOrder());
            }
        });
          
        for(Person p : listA) {
            System.out.println(p.getName());
        }
    }

两次执行的结果都是:

name1

name2

name3


对于Comparator和Compartor:

  使用Compartor接口实现排序:实现其compare()方法,根据第一个参数小于、等于或大于第二个参数分别返回负整数、零

或正整数来判断大小。强行对某个对象 collection进行整体排序的比较函数。可以将Comparator传递给sort方法(如 Collections.sort

huo Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Compartor来控制某些数据结构(如 有序set或有序映射)的顺序,

或者为那些没有自然顺的对象collection提供排序。

使用Comparable接口完成排序: 实现此接口的对象列表(和数组)可以通过Collecitons.sort(和Array.sory)进行自动排序。实现此接口

的对象可以用作有序映射中的键或有序集合中的元素,无序指定比较器。


二者的区别:

1:Comparable是在集合内部定义的方法实现的排序,Compartor实在集合歪脖实现的排序

2: 一个类实现了Comparable接口则表明这个类的对象之间是可以互相比较的,这个类对象组成的集合就可以直接使用sort方法排序。一般

     我们写的bean都要实现这一接口,这也是标准javabean的规范。

3:Comparator可以看成一种算法的实现,讲算法和数据分离,Compartor也可以在下面两种环境汇总使用:

1)  类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身

2)可以使用多种排序标准,比如升序、降序等。

0 0
原创粉丝点击