随笔-12  评论-6  文章-0  trackbacks-0
Arrays.sort(T[], Comparator < ? super T > c) 方法用于对象数组按用户自定义规则排序。
Collections.sort(List<T>, Comparator < ? super T > c)方法用于对象集合按用户自定义规则排序。

Comparable用在对象本身,说明这个对象是可以被比较的,也就是说可以被排序的。(String和Integer之所以可以比较大小,是因为它们都实现了Comparable接口,并实现了compareTo()方法)。
Compator用在对象外,相当于定义了一个排序算法。
所以当对象本身实现了Comparable接口,那么Arrays.sort(T[])就可以了。同理Collections.sort(List<T>)就可以了。

还是代码来的直接:
package com.zx.ww.comparable;

import java.util.Arrays;
import java.util.Comparator;

public class ComparatorTest {
    
    
public static void main(String[] args) {
        Dog d1 
= new Dog(2);
        
        Dog d2 
= new Dog(1);
        
        Dog d3 
= new Dog(3);
        
        Dog[] dogArray 
= {d1, d2, d3};
        
        printDogs(dogArray);
        
        Arrays.sort(dogArray, 
new DogSizeComparator());
        
        printDogs(dogArray);
    }
    
    
public static void printDogs(Dog[] dogArray) {
        
for (Dog dog : dogArray) {
            System.out.print(dog.size
+" ");
        }
        System.out.println();
    }

}

class Dog{
    
int size;
    
public Dog(int size) {
        
this.size = size;
    }
}

class DogSizeComparator implements Comparator<Dog> {
    @Override
    
public int compare(Dog dog1, Dog dog2) {
        
// TODO Auto-generated method stub
        return dog1.size - dog2.size;
    }
}
输出结果:
2 1 3 
1 2 3
这是对象数组用了Comparator的结果。

下面看对象自身实现了Comparable接口的方式:
/**
 * 
 
*/
package com.zx.ww.comparable;

import java.util.Arrays;

/**
 * 
@author wuwei
 * 2014年9月29日
 
*/
public class User implements Comparable<Object>{

    
private int id;
    
    
private String name;
    
    
private int age;
    
    
public User(int id, String name, int age) {
        
this.id = id;
        
this.name = name;
        
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 int getAge() {
        
return age;
    }



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


    @Override
    
public int compareTo(Object o) {
        
// TODO Auto-generated method stub
        return this.age - ((User)o).getAge();
    }
    
    
public static void main(String[] args) {
        User[] users 
= new User[] {new User(1,"zhangsan",28), new User(2,"lisi",25)};
        Arrays.sort(users);
        
for (int i = 0; i < users.length; i++) {
            User user 
= users[i];
            System.out.println(user.getId()
+" "+user.getAge());
        }
    }
    
}
输出结果:
2 25
1 28
上述都是Arrays.sort()的应用方式,同理Collections.sort()一样的实现,代码如下,比较简单:
package com.zx.ww.comparable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CollectionSortTest {

    
public static void main(String[] args) {
        List
<String> list = new ArrayList<String>();
        list.add(
"ac");
        list.add(
"ab");
        list.add(
"aa");
        list.add(
"db");
        list.add(
"ca");
        
        
for (String string : list) {
            System.out.print(string 
+ " ");
        }
        System.out.println();
        Collections.sort(list);
        
        
for (String string : list) {
            System.out.print(string 
+ " ");
        }
        System.out.println();
        
        
//对象A自身实现Comparable接口
        List<A> aList = new ArrayList<A>();
        aList.add(
new A("wuwei"1));
        aList.add(
new A("zhangsan"3));
        aList.add(
new A("lisi"2));
        
for (A a : aList) {
            System.out.print(a
+" ");
        }
        System.out.println();
        Collections.sort(aList);
        
for (A a : aList) {
            System.out.print(a
+" ");
        }
        System.out.println();
        
        
//重写Conparator接口方法
        List<B> bList = new ArrayList<B>();
        bList.add(
new B("wuwei"1));
        bList.add(
new B("zhangsan"3));
        bList.add(
new B("lisi"2));
        
for (B b : bList) {
            System.out.print(b
+" ");
        }
        System.out.println();
        Collections.sort(bList, 
new Comparator<B>() {

            @Override
            
public int compare(B b1, B b2) {
                
// TODO Auto-generated method stub
                return b1.getCount().compareTo(b2.getCount());
            }
        });
        
for (B b : bList) {
            System.out.print(b
+" ");
        }
        System.out.println();
        
    }
    
    
}

//对象A自身实现Comparable接口
class A implements Comparable<A>{

    
private String name;
    
    
private Integer order;
    
    
public A(String name, Integer order) {
        
this.name = name;
        
this.order = order;
    }
    
    
public String getName() {
        
return name;
    }

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

    
public Integer getOrder() {
        
return order;
    }

    
public void setOrder(Integer order) {
        
this.order = order;
    }

    
public String toString() {
        
return "name is " +name+" order is "+order;
    }
    
    @Override
    
public int compareTo(A o) {
        
// TODO Auto-generated method stub
        return this.order.compareTo(o.getOrder());
    }
    
}

class B{
    
private String name;
    
    
private Integer count;
    
    
public B(String name, Integer count) {
        
this.name = name;
        
this.count = count;
    }

    
public String getName() {
        
return name;
    }

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

    
public Integer getCount() {
        
return count;
    }

    
public void setCount(Integer count) {
        
this.count = count;
    }
    
    
public String toString() {
        
return "name is "+name+" count is "+count;
    }
}
输出结果:
ac ab aa db ca 
aa ab ac ca db 
name is wuwei order is 
1 name is zhangsan order is 3 name is lisi order is 2 
name is wuwei order is 
1 name is lisi order is 2 name is zhangsan order is 3 
name is wuwei count is 
1 name is zhangsan count is 3 name is lisi count is 2 
name is wuwei count is 
1 name is lisi count is 2 name is zhangsan count is 3








posted on 2014-09-29 16:08 小人物_Amor 阅读(1092) 评论(0)  编辑  收藏 所属分类: java

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


网站导航: