Подтвердить что ты не робот

Java: Сортировка немодифицируемого списка

Как это сделать?

Я попытался создать новый пустой список, а затем скопировать ему немодифицируемые элементы списка, но я получаю неподдерживаемую операцию.

Любая помощь приветствуется.

4b9b3361

Ответ 1

Создаете ли вы пустой список с помощью Collections.emptyList()? Если это так, это тоже немодифицируемый список, и это может быть источником вашей проблемы.

Создайте новый список, используя конструктор для реализации списка, например new ArrayList(). Вы можете передать исходный список в конструктор или использовать метод addAll().

Ответ 2

FWIW, google-collections это однострочный:

List<Foo> sorted = Ordering.natural().sortedCopy(unmodifiableList);

Ответ 3

    List unmodifiableList = Collections.unmodifiableList(list);

    List newList = new ArrayList(unmodifiableList);

    Collections.sort(newList);

Конструктор ArrayList принимает существующий список, читает его элементы (без их модификации!) и добавляет их в новый список.

Ответ 4

В Java 8 вы можете использовать API потоков. Например:

List<?> sortedList = unsortedList.stream().sorted().collect(Collectors.toList());

Ответ 5

Он должен работать, как описано. Элементы в немодифицируемом Списке сами по себе не подлежат модификации. Конечно, вы не можете сортировать немодифицируемый Список, потому что его нужно переписать с помощью операций добавления и удаления, и это запрещено.

Угадайте, что ошибка находится где-то в другом месте, лучше всего будет показывать ваш код:)

Ответ 6

Я отвечу на ваш второй вопрос:

Вы не можете добавить в свой список "taskListModifiable", потому что это "немодифицируемый" список, который в Java означает, что он неизменен. Неизменяемый/неизменный список или коллекция любого типа не могут быть напрямую изменены каким-либо образом - вы не можете добавлять к нему элементы, удалять из него элементы или изменять ссылки на существующие элементы.

Обратите внимание, что существующие элементы в списке/коллекции могут быть изменены, если они сами изменяемы, но ссылки на них из списка не могут быть изменены. То есть до тех пор, пока список не выйдет из сферы действия и не будет собран мусором, в немодифицируемом списке всегда будут те же ссылки.

Теперь, в вашем случае, Collections.emptyList() возвращает немодифицируемый список EMPTY. Это на самом деле всегда один и тот же экземпляр, поскольку он неизменен и всегда пуст. Вы не можете добавить к нему из-за правила, что неизменный список не может быть расширен (добавлен). Поскольку он пуст, в нем нет ничего, что можно изменить.

Я должен добавить, чтобы еще более ясно, что Collection.emptyList() не создает пустой список. Он просто возвращает ссылку на экземпляр списка singleton.