Сортировка Arraylist без изменения исходного списка - PullRequest
0 голосов
/ 27 мая 2020

Я нахожусь в ситуации, когда мне просто нужно отсортировать Arraylist настраиваемого объекта в поле члена класса. Мне это нужно просто для отображения некоторой информации пользователю. Я пробовал использовать компаратор , но он изменяет фактический список, который мне не нужен. Итак, для работы я сделал глубокую копию моего Arraylist и отсортировал этот клонированный Arraylist. Есть ли способ сделать это с эффективным использованием памяти, не создавая дублирующий Arraylist?

Ответы [ 3 ]

3 голосов
/ 27 мая 2020

Что ж, вам на самом деле не нужно делать глубокую копию, если только ваш Comparator не изменяет ваши объекты, чего не должно быть. Поэтому самый простой способ - сделать неглубокую копию:

ArrayList<String> original = new ArrayList<>();
ArrayList<String> copy = new ArrayList<>(original);
copy.sort(Comparator.naturalOrder());

Заменить Comparator.naturalOrder() вашей реальной реализацией Comparator. Например, если вы сравниваете поле участника, вы можете использовать Comparator.comparing как простой способ создать желаемый Comparator.

И чтобы ответить на ваш вопрос: Нет, это невозможно без дополнительных данных структура, потому что, с одной стороны, вы хотите изменить порядок элементов, т.е. отсортировать их, а с другой стороны, вы хотите, чтобы они оставались в том же порядке.

0 голосов
/ 27 мая 2020

Вы можете использовать потоки. Просто выполните потоковую передачу исходного списка, отсортируйте элементы и создайте новый список. Но Objects в списке должен реализовывать интерфейс Comparable, иначе вам нужно будет создать Comparator для управления сортировкой.

List<Integer> newList =
                original.stream().sorted(Comparator.naturalOrder())
                        .collect(Collectors.toList());

Допустим, у вас был класс Student, и вы хотели отсортировать список учеников по возрасту. Предположим, что у вас есть метод getAge, который вы можете сделать вот так.

List<Student> newList =
                listOfStudents.stream().sorted(Comparator.comparing(Student::getAge))
                        .collect(Collectors.toList());

Ни один из вышеперечисленных методов не изменяет исходный список.

0 голосов
/ 27 мая 2020

как я понял, вы хотите распечатать свой массив, отсортированный без изменения его исходного вида. если это то, что вам нужно, вы можете создать временный массив или просто массив и сохранить в нем отсортированные элементы, затем распечатать их, наконец, удалить его (в java, если вы объявили переменную локальной области, она будет удалена, когда программа покинет ее область)

...