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乾貨
▼微信掃一掃下圖↓↓↓二維碼關注