java 对象数据之间的比较并排序
package j1226.compare;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class User {private Integer id;private String name;private Integer age;private String address;public User(Integer id, String name, Integer age, String address) {this.id = id;this.name = name; this.age = age;this.address = address;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}/*= `toString` 方法返回该对象的字符串表示. 通常, toString 方法会返回一个 "以文本方式表示" 此对象的字符串. 结果应是一个简明但易于读懂的信息表达式. 建议所有子类都重写此方法.*/@Overridepublic String toString() {return "[User name=" + this.name + " age=" + this.age + " address="+ this.address + "]";}public static void main(String[] args) {List<User> users = new ArrayList<User>();users.add(new User(1, "Zhangsan", 20, "Wuchang"));users.add(new User(1, "Lisi", 24, "Wuchang"));users.add(new User(1, "Wangwu", null, "Hankou"));users.add(new User(1, "Lisi", null, "Wuchang"));users.add(new User(1, "Zhangsan", 22, "Qingshan"));users.add(new User(1, "Lisi", 22, "Qingshan"));for (User u : users) {System.out.println(u);}System.out.println();/* 使用户按照年龄从小到大排序, 如果年龄为空, 则视作最小值 *//*= 比较器 `Comparator<T>`用来比较某两个对象, 给出比较的结果.比较器本身并不跟被比较的对象有任何联系.内置方法int compare(T a, T b);用来比较两个参数, 用整数来表示比较的结果如果返回* 负数, 表示 a 应该排在 b 之前* 零, 表示 a 与 b 排列的位置相同* 正数, 表示 a 应该排在 b 之后所以, 以整数比较为例, 如果希望一个整数序列按照从小到大的顺序排列, 那么对应的比较器的实现为* 当 a 比 b 要小时, 返回负数* 当 a 与 b 相等时, 返回零* 当 a 比 b 要大时, 返回整数*/Comparator<User> ageAsc = new Comparator<User>() {@Overridepublic int compare(User a, User b) {if (a.getAge() == null) {return -1;}if (b.getAge() == null) {return 1;}return a.getAge() - b.getAge();}};Collections.sort(users, ageAsc);for (User u : users) {System.out.println(u);}System.out.println();/* 使用户按照年龄从大到小排序, 如果年龄为空, 则视作最小值; 如果年龄相同, 按照名字从小到大排序 *//*= 可比较的 `Comparable<T>`实现的此接口的类本身是具备自然顺序的.内置方法int compareTo(T another);用来将 this 与参数进行比较, 用整数来表示比较的结果如果返回* 负数, 表示 this 应该排在 another 之前* 零, 表示 this 与 another 排列的位置相同* 正数, 表示 this 应该排在 another 之后*/Comparator<User> ageDescNameAsc = new Comparator<User>() {@Overridepublic int compare(User a, User b) {// 如果年龄相同, 按照名字从小到大排序if (a.getAge() == b.getAge()) {return a.getName().compareTo(b.getName());}if (a.getAge() == null) {return 1;}if (b.getAge() == null) {return -1;}return b.getAge() - a.getAge();}};Collections.sort(users, ageDescNameAsc);for (User u : users) {System.out.println(u);}System.out.println();}}