昨天遇到一個集合排序的問題,要求在list中插入后數據有序,首先考慮使用集合自帶的排序方法,但需要把list轉成數組,排序后再轉回list。后來發現使用插入算法是最省事的,因為既然是在插入里排序,那么在插入前就先找好插入點,插入后序列就是有序的,以此類推。代碼貼上:
package com.wulinfeng.io; import java.util.Collections; import java.util.LinkedList; import java.util.List; public class SortList { List<Integer> sSorted = new LinkedList<>(); /** * 插入算法排序 * * @param e */ public void add(int e) { boolean inserted = false; // 非首次插入需要遍歷list,找到比插入值大的數所在索引並插入,后面的元素后移 for (int i = 0; i < sSorted.size(); i++) { if (e < sSorted.get(i)) { sSorted.add(i, e); inserted = true; break; } } // 沒找到值比自己大的插入點,追加到最后 if (!inserted) { sSorted.add(e); } } /** * 使用集合排序 * * @param e * @param useCollections */ public void add(int e, boolean useCollections) { if (useCollections) { // 先插入 sSorted.add(e); // 再排序 Collections.sort(sSorted); } } public static void main(String[] args) { SortList slist = new SortList(); slist.add(99); slist.add(3); slist.add(6); slist.add(128); System.out.println("插入排序后的list:"); for (Integer i : slist.sSorted) { System.out.printf("%3d\t", i); } System.out.println(""); slist.add(123, true); slist.add(45, true); slist.add(19, true); slist.add(318, true); System.out.println("集合排序后的list:"); for (Integer i : slist.sSorted) { System.out.printf("%3d\t", i); } } }
運行結果:
插入排序后的list: 3 6 99 128 集合排序后的list: 3 6 19 45 99 123 128 318
