昨天遇到一个集合排序的问题,要求在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 ", 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 ", i); } } }
运行结果:
插入排序后的list: 3 6 99 128 集合排序后的list: 3 6 19 45 99 123 128 318