zoukankan      html  css  js  c++  java
  • Java集合排序(面试必考点之一)

    集合是Java面试必考知识点,而集合的排序也是非常重要的,工作中经常用到,那么这个知识点也是必须要掌握的,下面是我曾经面试时被面试官问的问题:

    根据API可知,Java集合的工具类Collections提供了两种排序方式:Collections.sort(List list) 和 Collections.sort(List list,Comparator c)。

    第一种方式称为自然排序(一般是升序),参与排序的对象需实现comparable接口,重写其compareTo()方法。

    第二种方式称为自定义排序,需编写匿名内部类(匿名内部类后面篇章会讲解),先new一个Comparator接口的比较器对象,同时实现compare()其方法,
    然后将待排序的List列表对象和比较器对象传给Collections.sort()方法的参数列表中实现排序功能。

    特点:第一种方式相对简单,容易掌握(尤其是对匿名内部类不熟悉的同学),由于待比较对象需要实现comparable,增加了耦合度,属性规则排序不够灵活。

    第二种方式只需要在需要排序的地方,创建一个内部类的实例,重写其方法即可,灵活度更大。

     下面以Person类为例写一个分别按照年龄和姓名排序的例子:

    public class Person implements Comparable<Person> {
        private int age;
    
        private String name;
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Person(int age, String name) {
            super();
            this.age = age;
            this.name = name;
        }
    
        @Override
        public int compareTo(Person o) {
            if (this.age > o.age) {
                return 1;
            } else if (this.age < o.age) {
                return -1;
            } else {
                return 0;
            }
        }
    
        public static void main(String[] args) {
            List<Person> pList = new ArrayList<>();
            Person p1 = new Person(10, "a张三");
            Person p2 = new Person(18, "c李四");
            Person p3 = new Person(20, "b王五");
            Person p4 = new Person(15, "d陈六");
            pList.add(p1);
            pList.add(p2);
            pList.add(p3);
            pList.add(p4);
    
            System.out.println("排序前依次输出:");
            for (Person p : pList) {
                System.out.println(p.age + "===" + p.name);
            }
    
            // 按照年龄升序排序(默认)
            Collections.sort(pList);
    
            System.out.println("按年龄升序排序后依次输出:");
            for (Person p : pList) {
                System.out.println(p.age + "===" + p.name);
            }
    
            // 按照年龄倒叙排序
            Collections.reverse(pList);
    
            System.out.println("按年龄倒叙排序后依次输出:");
            for (Person p : pList) {
                System.out.println(p.age + "===" + p.name);
            }
    
            // 按照姓名升序排序
            Collections.sort(pList, new Comparator<Person>() {
                @Override
                public int compare(Person o1, Person o2) {
                    return o1.getName().compareTo(o2.getName());
                }
            });
    
            System.out.println("按照姓名升序排序后依次输出:");
            for (Person p : pList) {
                System.out.println(p.age + "===" + p.name);
            }
    
        }
    }

    排序前依次输出:
    10===a张三
    18===c李四
    20===b王五
    15===d陈六
    按年龄升序排序后依次输出:
    10===a张三
    15===d陈六
    18===c李四
    20===b王五
    按年龄倒叙排序后依次输出:
    20===b王五
    18===c李四
    15===d陈六
    10===a张三
    按照姓名升序排序后依次输出:
    10===a张三
    20===b王五
    18===c李四
    15===d陈六

    关注微信公众号【Java典籍】,收看更多Java干货

     ▼微信扫一扫下图↓↓↓二维码关注

     

  • 相关阅读:
    手写Promise——基于es6的Promise实现(含详细注释)
    手写promise
    package.json里面配置的啥
    package.json配置详解
    package.json的所有配置项及其用法,你都熟悉么
    sass语法进阶小结
    [转]利用vue-cli3快速搭建vue项目详细过程
    vue的接口封装和状态管理
    Vue项目封装请求数据的接口总结
    JSDoc入门使用指南 -- 手摸手教你用JSDoc(超好用的js文档生成工具)
  • 原文地址:https://www.cnblogs.com/bingyimeiling/p/10330838.html
Copyright © 2011-2022 走看看