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=今天天气不错!]