ArrayList — Создание компараторов

Я создал список ArrayList, содержащий ссылки на объекты, содержащие различные объемы данных.

Я хочу отсортировать объект по определенным элементам своих данных.

Я успешно сделал это, используя collections.sort вместе с анонимным классом, определяющим новый компаратор.

Я был успешен в каждом из новых компараторов, которые я создал, что привело к правильному порядку сортировки.

Для того же ArrayList как можно сделать компаратор, который бы давал исходный ввод порядка ArrayList. Я знаю, что ArrayList сохраняет порядок добавления объектов, порядок вставки. Но после сортировки ArrayList с другими компараторами, как мне отсортировать ArrayList обратно в исходный порядок, в котором он был? Это единственная вещь, которая ставит меня в тупик, и я не могу понять это.

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

Edit2: мне дан ArrayList, который, как ожидается, будет хранить несколько объектов, содержащих некоторые элементы данных, которые будут отсортированы, например, по их именам или возрасту. Эти компараторы было легко сделать, и я делаю это успешно. Назначение также требует исходного компаратора, который отображает данные в том виде, в каком они были вставлены. Теперь эти компараторы передаются в вызове метода, в котором этот метод будет использовать collections.sort для каждого другого компаратора. Однако он просит сначала использовать оригинальный компаратор.

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


person pudge    schedule 16.04.2016    source источник
comment
Я не уверен, что понимаю вопрос, как вы его разместили. Первая половина кажется совершенно не связанной со второй половиной. Предыдущий порядок теряется после сортировки, поэтому нет возможности вернуться к порядку вставки, потому что его ничто не отслеживает. Если вам нужно это отследить, сделайте это буквально, не сортируя свой массив, а создавая копию списка и сортируя ее, сохраняя исходный список.   -  person Mike 'Pomax' Kamermans    schedule 16.04.2016
comment
Клонируйте ArrayList перед сортировкой, чтобы сохранить состояние; и вы могли бы использовать эту клонированную копию позже.   -  person rev_dihazum    schedule 16.04.2016
comment
если это вопрос домашнего задания, покажите точную формулировку, не описывайте своими словами. Однако обратите внимание на как задавать вопросы по домашнему заданию? ветка, потому что домашние задания часто надуманные, а иногда и бессмысленные для людей, которые зарабатывают на жизнь, пытаются или привыкли использовать язык, для которого вы задаете вопросы (это похоже на ерунду)   -  person Mike 'Pomax' Kamermans    schedule 16.04.2016


Ответы (2)


Однако он просит сначала использовать оригинальный компаратор.

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

Цитирование javadoc из sort():

Такая сортировка гарантированно стабильна: одинаковые элементы не будут переупорядочены в результате сортировки.

Это означает, что если вы передадите компаратор, который утверждает, что все объекты равны, никакого переупорядочения не произойдет.

// Java 8 example using lambda expression
Collections.sort(list, (a,b) -> 0); // No-op. All elements compare equal
person Andreas    schedule 16.04.2016
comment
Да, я считаю, что это правильный подход, и это то, что я в итоге сделал (я только что вернул 0). То, как это было сформулировано, казалось, хотело восстановить порядок, я думал, что недопонимаю или что-то совсем упустил, потому что это не имело смысла. Но то, как устроена первоначальная программа до того, как я ее закончил, касается не столько «восстановления порядка». - person pudge; 16.04.2016

Помимо создания клона (прокомментированного выше), объект должен содержать отдельное поле, которое отслеживает порядок, вставленный в массив, и написать для него компаратор.

person Scott Sosna    schedule 16.04.2016
comment
Да, к сожалению, ни то, ни другое не разрешено в моих обстоятельствах. Я думаю, что это просто держатель пробела, поэтому метод можно вызвать, поскольку он ожидает передачи компаратора. Ничего другого быть не может.. - person pudge; 16.04.2016
comment
то вы, вероятно, застряли с клонированием оригинальной коллекции - person Scott Sosna; 16.04.2016