您好,登錄后才能下訂單哦!
這篇文章主要介紹“java中怎么對arrayList按數字大小逆序排序”,在日常操作中,相信很多人在java中怎么對arrayList按數字大小逆序排序問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java中怎么對arrayList按數字大小逆序排序”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
對集合排序要用Collections.sort方法,由于默認它是按從小到大的排序的,如果我們需要逆序的,那么就需要實現Comparator接口的compare方法來完成自定義排序。
需要注意Comparator是接口,new Comparator(){} 的作用是new了一個實現接口的匿名類,開發人員需要在匿名類內部(花括號內)實現你那個接口。
代碼
public static void main(String[] args) { Integer[] nums = {1,5,34,6,8,7,33}; ArrayList<Integer> numberList = new ArrayList<>(); Collections.addAll(numberList, nums); // 排序前 System.out.println("逆序前 numberList " + numberList); // 排序后 ArrayList<Integer> copyList = new ArrayList<>(numberList); Collections.sort(copyList, new Comparator<Integer>() { @Override public int compare(Integer num1, Integer num2) { if (num1 > num2) { return -1; } else { return 1; } } }); System.out.println("逆序后 copyList " + copyList); // 原列表不變 System.out.println("逆序后 numberList " + numberList); }
ArrayList中存在sort排序方法,只要你實現了Comparator的接口,按照你自己的排序業務進行實現,你只要告訴這個接口按照什么類型進行排序就OK了。這種方式類似于設計模式中的策略模式,把流程劃分好,具體的業務邏輯由用戶指定
代碼實現:
public class ComparatorTest { public static void main(String[] args) { baseTypeSort(); referenceTypeSort(); } private static void referenceTypeSort() { Person p1 = new Person(10); Person p2 = new Person(16); Person p3 = new Person(1); Person p4 = new Person(8); Person p5 = new Person(100); List<Person> people = new ArrayList<>(); people.add(p1); people.add(p2); people.add(p3); people.add(p4); people.add(p5); System.out.println("排序前:" + people); people.sort((o1, o2) -> o2.getAge() - o1.getAge()); System.out.println("降序:" + people); Collections.sort(people, (o1, o2) -> o1.getAge() - o2.getAge()); System.out.println("升序:" + people); people.sort(Comparator.comparing(Person::getAge)); System.out.println("comparing寫法升序:" + people); people.sort(Comparator.comparing(Person::getAge).reversed()); System.out.println("comparing寫法降序:" + people); } private static void baseTypeSort() { // 初始化一組數據,這組數據可以是任意對象 int[] data = {7, 5, 1, 2, 6, 8, 10, 12, 4, 3, 9, 11, 13, 15, 16, 14}; // 構建成一個集合 List<Integer> list = new ArrayList<>(); for (int i = 0; i < data.length; i++) { list.add(data[i]); } System.out.println("排序前:" + list); //逆序 list.sort((o1, o2) -> o2 - o1); System.out.println("降序:" + list); } }
由于現在主流jdk都升級到1.8以上,所以使用lamda表達式實現,這里簡單介紹一下lamda表達式使用:
以逗號分隔,以()關閉的形參:(Integer m, Integer n)
箭頭標記:->
主體部分則是一個單表達式或者聲明代碼塊。
如下是單表達式形式:
(o1, o2) -> o2.getAge() - o1.getAge()
注意點:
Java7,list并沒有sort方法,請使用Collections.sort(),Collections.sort()傳入ArrayList和自己實現Commparator接口的類的對象,實現自定義排序
使用Collections.sort()傳入ArrayList和自己實現Commparator接口的類的對象,實現自定義排序
使用List.sort()傳入自己實現Commparator接口的類的對象,實現自定義排序
Comparator返回值在jdk1.7、jdk1.8里必須是一對相反數,可以使用差值簡化寫法,正數表示升序,負數表示降序
ArrayList中的sort排序是采用歸并排序的,當數組中的數據非常大的時候,會采用幾次歸并來完成排序.具體采用幾次歸并,會通過相關方法進行計算
Collections.sort方法底層就是調用的Arrays.sort方法,而Arrays.sort底層調用了一個非常優秀的工程排序實現算法:TimSort,Timsort是一種結合了歸并排序和插入排序的混合算法,由Tim Peters在2002年提出,并且已經成為Python 2.3版本以后內置排序算法。
在數據量小的時候使用插入排序,雖然插入排序的時間復雜度是O(n^2),但是它的常數項比較小,在數據量較小的時候具備較快的速度。
在數據量較大的時候,如果是基本類型,使用快速排序,如果是引用類型使用歸并排序。這是因為快速排序是不穩定的,而插入排序和歸并排序都是穩定性排序。
到此,關于“java中怎么對arrayList按數字大小逆序排序”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。