Java API针对集合类型排序提供了两种支持:
java.util.Collections.sort(java.util.List)
java.util.Collections.sort(java.util.List, java.util.Comparator)

第一个方法要求所排序的元素类必须实现java.lang.Comparable接口。

第二个方法要求实现一个java.util.Comparator接口。

下面给出测试代码,然后代码的概述如下:(不要看到一百多行代码,就给你吓跑啦哈。大师兄辛辛苦苦测试的呢)

主要是给
(1.)Person类的实例集合按age和name排序,有升有降。
这个是按照第二个方法排序,单独实现一个比较器,然后调用Collections.sort()排序
(2.)Car类的实例集合按price排序,升序排列。

然后,实现代码如下:

import com.google.common.collect.Lists; 
 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 
 
/** 
 * Created by lxk on 2016/8/31 
 */ 
 
class Person { 
    private int age; 
    private String name; 
 
    Person(int age, String name) { 
        this.age = age; 
        this.name = name; 
    } 
 
    public int getAge() { 
        return age; 
    } 
 
    public void setAge(int age) { 
        this.age = age; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    @Override 
    public String toString() { 
        return "Person{" + 
                "age=" + age + 
                ", name='" + name + '\'' + 
                '}'; 
    } 
} 
 
class PersonByAge implements Comparator<Person> { 
 
    @Override 
    public int compare(Person o1, Person o2) { 
        //这可以修改来升序或者降序 
        //return o2.getAge() - o1.getAge();//降序 
        return o1.getAge() - o2.getAge();//升序 
    } 
} 
 
class PersonByName implements Comparator<Person> { 
 
    @Override 
    public int compare(Person o1, Person o2) { 
        //这可以修改来升序或者降序 
        //return o2.getName().compareTo(o1.getName());//降序 
        return o1.getName().compareTo(o2.getName());//升序 
    } 
} 
 
class Car implements Comparable<Car> { 
    private String sign; 
    private int price; 
 
    public Car(String sign, int price) { 
        this.sign = sign; 
        this.price = price; 
    } 
 
    public String getSign() { 
        return sign; 
    } 
 
    public void setSign(String sign) { 
        this.sign = sign; 
    } 
 
    public int getPrice() { 
        return price; 
    } 
 
    public void setPrice(int price) { 
        this.price = price; 
    } 
 
    @Override 
    public int compareTo(Car o) { 
        //同理也可以根据sign属性排序,就不举例啦。 
        return this.getPrice() - o.getPrice(); 
    } 
 
    @Override 
    public String toString() { 
        return "Car{" + 
                "sign='" + sign + '\'' + 
                ", price=" + price + 
                '}'; 
    } 
} 
 
class Cmshome { 
    public static void main(String[] args) { 
        System.out.println("Person 集合:第二个方法要求实现一个java.util.Comparator接口。"); 
        Person p1 = new Person(11, "adf"); 
        Person p2 = new Person(99, "ggf"); 
        Person p3 = new Person(21, "444"); 
        Person p4 = new Person(15, "yrf"); 
 
        //集合初始化的时候,若大小可知,应初始化固定大小的集合,也是个好习惯。 
        List<Person> persons = Lists.newArrayListWithCapacity(4); 
        persons.add(p1); 
        persons.add(p2); 
        persons.add(p3); 
        persons.add(p4); 
 
        //注释是因为这个产生的列表有序啦。 
        //代码里面有很多的空行是为了把不同功能的代码段分开,良好的编码习惯。 
        // 写完代码记得格式化一下,也是习惯。 
        //每个方法每个类都得带Java doc文档注释也是好习惯,当然我就不加了,提醒一下读者的你。 
        //for (int i = 0; i < 4; i++) { 
        //    persons.add(new Person(i, "cms" + i)); 
        //} 
        System.out.println("persons原来的默认顺序如下:"); 
        for (Person p : persons) { 
            System.out.println(p.toString()); 
        } 
 
        System.out.println("------下面按 age int 类型排序-----升序-------"); 
        Comparator<Person> ascComparatorByAge = new PersonByAge(); 
        Collections.sort(persons, ascComparatorByAge); 
        for (Person p : persons) { 
            System.out.println(p.toString()); 
        } 
 
        System.out.println("-------下面按 name string类型排序----Java升序-------"); 
        Comparator<Person> ascComparatorByName = new PersonByName(); 
        Collections.sort(persons, ascComparatorByName); 
        for (Person p : persons) { 
            System.out.println(p.toString()); 
        } 
 
 
        System.out.println("Car 集合:第一个方法要求所排序的元素类必须实现java.lang.Comparable接口。"); 
 
        Car car1 = new Car("ben", 1000); 
        Car car2 = new Car("qqq", 1); 
        Car car3 = new Car("bmw", 10000); 
        Car car4 = new Car("wow", 100); 
        List<Car> cars = Lists.newArrayListWithCapacity(4); 
        cars.add(car1); 
        cars.add(car2); 
        cars.add(car3); 
        cars.add(car4); 
 
        System.out.println("cars原来的默认顺序如下:"); 
        for (Car car : cars) { 
            System.out.println(car.toString()); 
        } 
 
        System.out.println("------下面按 price int 类型排序--升序----------"); 
        Collections.sort(cars); 
        for (Car car : cars) { 
            System.out.println(car.toString()); 
        } 
    } 
 
} 

然后是上述代码的执行结果,如下:

//测试结果如下:   
"C:\Program Files\Java\jdk1.8.0_73\bin\java"   
Person 集合:第二个方法要求实现一个java.util.Comparator接口。 
persons原来的默认顺序如下: 
Person{age=11, name='adf'} 
Person{age=99, name='ggf'} 
Person{age=21, name='444'} 
Person{age=15, name='yrf'} 
------下面按 age int 类型排序-----升序------- 
Person{age=11, name='adf'} 
Person{age=15, name='yrf'} 
Person{age=21, name='444'} 
Person{age=99, name='ggf'} 
-------下面按 name string类型排序----Java升序------- 
Person{age=21, name='444'} 
Person{age=11, name='adf'} 
Person{age=99, name='ggf'} 
Person{age=15, name='yrf'} 
Car 集合:第一个方法要求所排序的元素类必须实现java.lang.Comparable接口。 
cars原来的默认顺序如下: 
Car{sign='ben', price=1000} 
Car{sign='qqq', price=1} 
Car{sign='bmw', price=10000} 
Car{sign='wow', price=100} 
------下面按 price int 类型排序--升序---------- 
Car{sign='qqq', price=1} 
Car{sign='wow', price=100} 
Car{sign='ben', price=1000} 
Car{sign='bmw', price=10000} 
 
Process finished with exit code 0

再然后就是若要是按照字母表去排序的话可以参考如下链接:

汉字按字母表排序的解决方案

还有个问题,你还不一定遇得到,但是还是建议看一下。如下链接:

有时候你觉得你的代码没问题,但是运行的时候,就异常啦。因为排序对象属性可能都是null,上面代码没考虑这个


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

java中的==、equals()、hashCode()源码分析知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。