java List 排序

1、Comparator

  方法为外部比较器,实例引用无法改变类本身,不能实现Comparable 接口 则推荐使用该方法

  代码实例:

package blade;

public class Person {

    private int id;

    private String name;

    private int age;

    private String description;

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

    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;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", age=" + age + ", description=" + description + "]";
    }
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import blade.Person;

public class CollCompare {
    public static void main(String args[]) {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person(5, "jack", 22, "今天天气不错!"));
        personList.add(new Person(2, "sufei", 22, "今天天气不错!"));
        personList.add(new Person(3, "tom", 45, "今天天气不错!"));
        personList.add(new Person(4, "luce", 22, "今天天气不错!"));
        personList.add(new Person(5, "ben", 6, "今天天气不错!"));
        personList.add(new Person(6, "judi", 70, "今天天气不错!"));
        Collections.sort(personList, new Comparator<Person>() {
            //
            @Override
            public int compare(Person person1, Person person2) {
                if (person1.getAge() > person2.getAge()) {
                    return 1;
                } else if (person1.getAge() == person2.getAge()) {
                    if (person1.getId() > person2.getId()) {
                        return 1;
                    } else {
                        return -1;
                    }
                } else
                    return -1;
            }
        });
        for (int i = 0; i < personList.size(); i++) {
            System.out.println(personList.get(i).toString());
        }
    }
}

  运行结果:

Person [id=4, name=luce, age=2, description=今天天气不错!]
Person [id=5, name=ben, age=6, description=今天天气不错!]
Person [id=2, name=sufei, age=22, description=今天天气不错!]
Person [id=5, name=jack, age=22, description=今天天气不错!]
Person [id=3, name=tom, age=45, description=今天天气不错!]
Person [id=6, name=judi, age=70, description=今天天气不错!]

  总结: param1 > param2 return 1 ------>  在 param1 > param2 的情况下 需要交换

      param1 = param2 return 0 ------> 相等情况下可以进行第二列比较

      param1 < param2 return -1 ------> 降序 param1 < param2 情况下 不需要交换

     (return 结果 > 0 需要交换, =0 可以进行第二列比较, <0 代表不需要交换

2、Comparator

  方法为内部部比较器,实现Comparable接口 

  代码实例:

package blade;

public class Person2 implements Comparable<Person2>{

    private int id;

    private String name;

    private int age;

    private String description;

    public Person2(int id, String name, int age, String description) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.description = description;
    }

    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;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", age=" + age + ", description=" + description + "]";
    }

    @Override
    public int compareTo(Person2 person2) {
        if (this.getId() > person2.getId()) {
            return 1;
        } else if (this.getId() == person2.getId()) {
            return 0;
        } else {
            return -1;
        }
    }
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import blade.Person2;

public class CollCompare {
    public static void main(String args[]) {
        List<Person2> personList = new ArrayList<Person2>();
        personList.add(new Person2(5, "jack", 22, "今天天气不错!"));
        personList.add(new Person2(2, "sufei", 22, "今天天气不错!"));
        personList.add(new Person2(3, "tom", 45, "今天天气不错!"));
        personList.add(new Person2(4, "luce", 22, "今天天气不错!"));
        personList.add(new Person2(5, "ben", 6, "今天天气不错!"));
        personList.add(new Person2(6, "judi", 70, "今天天气不错!"));
        Collections.sort(personList);
        personList.stream().forEach(System.out::println);
    }
}

  类中实现接口方法进行排序

运行结果:

Person [id=2, name=sufei, age=22, description=今天天气不错!]
Person [id=3, name=tom, age=45, description=今天天气不错!]
Person [id=4, name=luce, age=22, description=今天天气不错!]
Person [id=5, name=jack, age=22, description=今天天气不错!]
Person [id=5, name=ben, age=6, description=今天天气不错!]
Person [id=6, name=judi, age=70, description=今天天气不错!]
原文地址:https://www.cnblogs.com/lixuchun/p/8867573.html