我们怎么比较两个对象,取出每一个值进行比较也行,但是写出的代码不优雅,还记得我们学过的equals方法吗?
我们既然能做等值比较,为什么不能做大小的比较呢?
User类
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
", height=" + height +
'}';
}
}
比较接口
public interface Comparator {
Integer compare(User user, User user1);
}
比较年龄的策略——User也不需要直接实现某些接口
public class CompareAgeStrategy implements Comparator {
public Integer compare(User user, User user1) {
return user.getAge() - user1.getAge();
}
}
比较身高的策略
public class CompareHeightStrategy implements Comparator {
public Integer compare(User user, User user1) {
return (int)(user.getHeight() - user1.getHeight());
}
}
排序
public class UserSorter {
// Comparator comparator:传的是接口!!!
public void sort(User users[], Comparator comparator) {
// 冒泡排序
for (int i = 0; i < users.length - 1; i++) {
for (int j = 0; j < users.length - i - 1; j++) {
if (comparator.compare(users[j], users[j + 1]) > 0) {
User temp = users[j];
users[j] = users[j + 1];
users[j + 1] = temp;
}
}
}
}
}
客户端
import java.util.Arrays;
public class Client {
public static void main(String[] args) {
User user1 = new User("小王", 12, 153.4);
User user2 = new User("小李", 14, 163.4);
User user3 = new User("小张", 13, 123.4);
User user4 = new User("小杨", 4, 6.4);
User[] users = {user1, user2, user3, user4};
UserSorter userSorter = new UserSorter();
userSorter.sort(users, new CompareAgeStrategy());
// 打印一个数组
System.out.println(Arrays.toString(users));
// 客户端想怎么排序,到时候 new 一个策略就完了
userSorter.sort(users, new CompareHeightStrategy());
System.out.println(Arrays.toString(users));
}
}
运行结果:
[User{username='小杨', age=4, height=6.4}, User{username='小王', age=12, height=153.4}, User{username='小张', age=13, height=123.4}, User{username='小李', age=14, height=163.4}]
[User{username='小杨', age=4, height=6.4}, User{username='小张', age=13, height=123.4}, User{username='小王', age=12, height=153.4}, User{username='小李', age=14, height=163.4}]
优化——箭头函数
@FunctionalInterface
public interface Comparator {
Integer compare(User user, User user1);
}
import java.util.Arrays;
public class Client {
public static void main(String[] args) {
User user1 = new User("小王", 12, 153.4);
User user2 = new User("小李", 14, 163.4);
User user3 = new User("小张", 13, 123.4);
User user4 = new User("小杨", 4, 6.4);
User[] users = {user1, user2, user3, user4};
UserSorter userSorter = new UserSorter();
/* userSorter.sort(users, new CompareAgeStrategy());*/
/*
userSorter.sort(users, new Comparator() {
@Override
public Integer compare(User user, User user1) {
return user.getAge() - user1.getAge();
}
});
*/
userSorter.sort(users,
(user, otherUser) -> user.getAge() - user1.getAge()
);
// 打印一个数组
System.out.println(Arrays.toString(users));
// 客户端想怎么排序,到时候 new 一个策略就完了
userSorter.sort(users, new CompareHeightStrategy());
System.out.println(Arrays.toString(users));
}
}