2012-03-09 103 views
5

對於數組存在來自索引排序所述陣列的一部分,以索引一個特殊功能:爪哇:排序列表從索引到索引

Arrays.sort(Object[] a, int fromIndex, int toIndex)

對於List< T>

還有一個功能用於分揀

Collections.sort(List<T> list)

不幸沒有變體接受fromI ndex和toIndex參數。

我知道,我既可以由應用

  • 解決這個問題轉換列表到一個數組中,並應用Arrays.sort,然後將其轉換回一個列表
  • 通過複製指數的fromIndex列表條目以指數到一個新的列表(通過使用list.subList(fromIndex, toIndex)),排序並覆蓋舊的列表條目

但我希望有一個更漂亮的方式來做到這一點。

+1

嗨,老兄,有一個在轉換爲數組,享受一些額外的功能,再轉換回沒有羞恥;) – 2012-03-09 23:47:25

回答

10

只需使用.subList()獲取主列表上的「備份」視圖,然後調用排序。子列表是「直寫」,所以更改反映在原始文件中。

List<Integer> foo = Arrays.asList(5,3,1,6,2,1); 
Collections.sort(foo.subList(0, 3)); // sort first 3 elements 
System.out.println(foo); 
Collections.sort(foo.subList(3, 6)); // sort last 3 elements 
System.out.println(foo); 

輸出

[1, 3, 5, 6, 2, 1] 
[1, 3, 5, 1, 2, 6] 
+0

+1,你使它看起來那麼簡單:-) – 2012-03-10 18:50:17

2

您可以將原來的名單上使用subList(),然後進行排序的子表,它將原來的名單上反映,而不必寫回。

2

通過複製指數的fromIndex到toIndex到一個新的列表 列表項(通過使用list.subList(的fromIndex,toIndex)),其排序並覆蓋 舊列表條目

不,當您調用list.subList時沒有對象副本。函數subList創建一個由原始列表支持的視圖。只有參考副本;沒有實際的對象副本。

視圖上的任何操作(排序)都會反映在原始列表中。

public static void main(String[] args) throws Exception { 
    List<Integer> list = Arrays.asList(1, 9, 8 ,7, 2, 3, 4); 

    // [9, 8 ,7] => [7, 8, 9] 
    sortList(list, 1, 4); 

    System.out.println(list);  // [1, 7, 8, 9, 2, 3, 4] 
    } 

    public static <T extends Comparable<T>> void sortList(
     List<T> list, int fromIndex, int toIndex) { 
    Collections.sort(list.subList(fromIndex, toIndex)); 
    }