zoukankan      html  css  js  c++  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接口两种方法。
    可以说一个是自已完成比较,一个是外部程序(自定义比较规则)实现比较的差别而已。
    方式一相对来说耦合度比较高,不优雅。

  • 相关阅读:
    10 道选择题,测试你是不是死忠谷粉
    JBoss Seam 3.0.0.Beta2 发布
    送给十二星座的名言警句
    Chinasb & B3log!
    GAE 博客——B3log Solo 0.2.5 正式版发布了!
    明天发布 B3log Solo 0.2.5
    JBoss Seam 3.0.0.Beta2 发布
    10 道选择题,测试你是不是死忠谷粉
    Python数据分析工具包:Pandas
    Programming Computer Vision with Python: Tools and algorithms for analyzing images
  • 原文地址:https://www.cnblogs.com/itlihao/p/14947978.html
Copyright © 2011-2022 走看看