java 对象数据其间的比较并排序
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 方法会返回一个 "以文本方式表示" 此对象的字符串. 结果应是一个简明但易于读懂的信息表达式. 建议所有子类都重写此方法.*/ @Override public 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>() { @Override public 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>() { @Override public 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(); } }