从制造到创造
软件工程师成长之路
posts - 292,  comments - 96,  trackbacks - 0
Comparable & Comparator 都是用来实现集合中的排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

一、Comparator

强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。

接口方法:

  /**
   * 
@return o1小于、等于或大于o2,分别返回负整数、零或正整数。
   
*/
  
int compare(Object o1, Object o2);


二、Comparable

强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。

接口方法:

  /**
   * 
@return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。 
   
*/
  
int compareTo(Object o);

三、Comparator和Comparable的区别
一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等。

完整代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortObject {
    
public static void main(String[] args) {
        sortByComparable();
        sortByComparator();
    }

    
/**
     * 通过Comparable排序
     
*/
    
public static void sortByComparable() {
        List list 
= new ArrayList();
        list.add(
new Person("Coder"1));
        list.add(
new Person("King"3));
        list.add(
new Person("Dream"2));
        list.add(
new Person("Baby"4));

        System.out.println(
"--- Sort Before ---");
        printPerson(list);
        Collections.sort(list);
        System.out.println(
"--- After Sorted  ---");
        printPerson(list);
    }

    
/**
     * 通过Comparator排序
     
*/
    
public static void sortByComparator() {
        List list 
= new ArrayList();
        list.add(
new Person("Coder"1));
        list.add(
new Person("King"3));
        list.add(
new Person("Dream"2));
        list.add(
new Person("Baby"4));

        System.out.println(
"--- Sort Before ---");
        printPerson(list);
        Collections.sort(list, 
new PersonComparator());
        System.out.println(
"--- After Sorted  ---");
        printPerson(list);
    }

    
/**
     * 打印List
     * 
     * 
@param list
     
*/
    
public static void printPerson(List list) {
        
int size = list.size();
        Person p 
= null;
        
for (int i = 0; i < size; i++) {
            p 
= (Person) list.get(i);
            System.out.println(p.getName() 
+ ":" + p.getId());
        }
    }

}

class Person implements Comparable {
    
public String name;
    
public int id;

    
public Person() {
    }

    
public Person(String name, int id) {
        
this.name = name;
        
this.id = id;
    }

    
public String getName() {
        
return name;
    }

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

    
public int getId() {
        
return id;
    }

    
public void setId(int id) {
        
this.id = id;
    }

    
public int compareTo(Object o) {
        Person p 
= (Person) o;
        
return this.getName().compareTo(p.getName());
    }
}

class PersonComparator implements Comparator {

    
public int compare(Object o1, Object o2) {
        Person p1 
= (Person) o1;
        Person p2 
= (Person) o2;
        
return p1.name.compareTo(p2.name);
    }
}
输出结果:
--- Sort Before ---
Coder:1
King:3
Dream:2
Baby:4
--- After Sorted  ---
Baby:4
Coder:1
Dream:2
King:3
--- Sort Before ---
Coder:1
King:3
Dream:2
Baby:4
--- After Sorted  ---
Baby:4
Coder:1
Dream:2
King:3


参考:
1、Comparator和Comparable在排序中的应用
2、 java中对于复杂对象排序的模型及其实现 [转]
posted on 2008-08-20 11:37 CoderDream 阅读(337) 评论(0)  编辑  收藏 所属分类: 学习笔记

只有注册用户登录后才能发表评论。


网站导航:
 

<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(9)

我参与的团队

随笔分类(245)

随笔档案(239)

文章分类(3)

文章档案(3)

收藏夹(576)

友情链接

搜索

  •  

积分与排名

  • 积分 - 454032
  • 排名 - 115

最新评论

阅读排行榜

评论排行榜