Java实现自定义排序
前言:排序是编程中经常需要用到的功能,通常我们可以通过对我们的查询SQL进行排序。在 Java 的工具类 Collections 中也提供了 sort() 方法用于实现对列表等集合中元素的排序。
Collections.sort() 方法有两种形式:Collections.sort(List) 和 Collections.sort(List, Comparator)。
1. 实现 Comparable 接口
public interface Comparable<T> {
public int compareTo(T o);
}
Comparable 是排序接口,一个类实现了Comparable接口,就意味着该类支持排序。
接口中通过x.compareTo(y) 来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。
直接上代码
public class User implements Comparable<User> {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(User user) {
return age - user.getAge();
}
}
public class JavaBase {
public static void main(String[] args) {
User user1 = new User("Jackie", 25);
User user2 = new User("Jim", 18);
User user3 = new User("Lucy", 30);
User user4 = new User("Kate", 18);
List<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
System.out.println("排序前" );
for (User user : users) {
System.out.println(user.getName() + " " + user);
}
// ================对集合进行排序==================
Collections.sort(users);
System.out.println("排序后" );
for (User user : users) {
System.out.println(user.getName() + " " + user);
}
}
}
2. 实现 Comparator 接口
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
接口中通过x.compare(y) 来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。
直接上代码
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(User user) {
return age - user.getAge();
}
}
public class UserComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
User user1 = (User) o1;
User user2 = (User) o2;
if (user1.getAge() > user2.getAge()) {
return 1;
} else if (user1.getAge() < user2.getAge()) {
return -1;
} else {
//利用String自身的排序方法。
//如果年龄相同就按名字进行排序
return user1.getName().compareTo(user2.getName());
}
}
}
public class JavaBase {
public static void main(String[] args) {
User user1 = new User("Jackie", 25);
User user2 = new User("Jim", 18);
User user3 = new User("Lucy", 30);
User user4 = new User("Kate", 18);
List<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
System.out.println("排序前" );
for (User user : users) {
System.out.println(user.getName() + " " + user);
}
// ================对集合进行排序==================
Collections.sort(users,new UserComparator());
System.out.println("排序后" );
for (User user : users) {
System.out.println(user.getName() + " " + user);
}
}
}
3. 二者区别
Comparable和Comparator都是用来实现集合中元素的比较、排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以想要实现排序,就需要在集合外定义Comparator接口或在集合内实现Comparable接口两种方法。
可以说一个是自已完成比较,一个是外部程序(自定义比较规则)实现比较的差别而已。
方式一相对来说耦合度比较高,不优雅。