2012-03-09 55 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)); 
    }