Java實現自定義排序
阿新 • • 發佈:2021-06-29
前言:排序是程式設計中經常需要用到的功能,通常我們可以通過對我們的查詢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介面兩種方法。
可以說一個是自已完成比較,一個是外部程式(自定義比較規則)實現比較的差別而已。
方式一相對來說耦合度比較高,不優雅。