1. 程式人生 > 其它 >Java實現自定義排序

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介面兩種方法。
可以說一個是自已完成比較,一個是外部程式(自定義比較規則)實現比較的差別而已。
方式一相對來說耦合度比較高,不優雅。