2012-03-09 2 views
5

Для массивов есть специальная функция для сортировки части массива от индекса к индексу:Java: сортировать список из индекса к индексу

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

Для List< T>

есть также функция для сортировки

Collections.sort(List<T> list)

Unluckily нет варианта приняв fromI ndex и toIndex.

Я знаю, что я мог бы решить эту проблему, либо применяя

  • Преобразование списка в массив и применить Arrays.sort, а затем преобразовать его обратно в список
  • Копирование записей списка проиндексированных fromIndex чтобы toIndex в новый список (с использованием list.subList(fromIndex, toIndex)), сортировать его и перезаписать старый список записей

Но я надеюсь, что есть симпатичнее способ сделать это.

+1

Эй люди, нет никакого позора в преобразовании в массив, наслаждаясь несколько дополнительных функций, то преобразование обратно;) –

ответ

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, вы сделали это выглядит так просто :-) –

2

Вы можете использовать subList() на своем первоначальном списке, затем отсортировать подсписок, и она будет отражать на первоначальный список без обратной записи.

1

Глядя на документацию Oracle, Collections и List просто не содержат эту функцию, например, Arrays. Если бы мне пришлось выбирать между двумя вашими предложениями, я бы использовал второй, используя List.subList(fromIndex, toIndex)).

Вот эти документы: http://docs.oracle.com/javase/7/docs/api/java/util/List.html
http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html
http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

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)); 
    } 
Смежные вопросы