Java集合排序(面试必考点之一)
程序员文章站
2022-05-23 12:22:11
集合是Java面试必考知识点,而集合的排序也是非常重要的,工作中经常用到,那么这个知识点也是必须要掌握的,下面是我曾经面试时被面试官问的问题: 根据API可知,Java集合的工具类Collections提供了两种排序方式:Collections.sort(List list) 和 Collectio ......
集合是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干货
▼微信扫一扫下图↓↓↓二维码关注