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();
	}
}