Основываясь на том, что сказал Хури, я думаю, что самый простой способ сделать это - создать новый тип данных, который выглядит примерно так:
public class Foo {
private Integer value;
private int origPosition;
private int sortedPosition;
/*Constructors, getters, setters, etc... */
}
И некоторый псевдо-код для того, что делатьэто ...
private void printSortIndexes(ArrayList<Integer> integerList) {
// Create an ArrayList<Foo> from integerList - O(n)
// Iterate over the list setting the origPosition on each item - O(n)
// Sort the list based on value
// Iterate over the list setting the sortedPosition on each item - O(n)
// Resort the list based on origPositon
// Iterate over the lsit and print the sortedPositon - O(n)
}
Это не займет много времени для реализации, но это ужасно неэффективно.Вы добавляете дополнительные 4 O (n) операций, и каждый раз, когда вы добавляете или удаляете что-либо из своего списка, все позиции, хранящиеся в объектах, становятся недействительными - так что вам придется все пересоздавать.Кроме того, требуется, чтобы вы отсортировали список дважды.
Так что, если это небольшая проблема с набором данных небольшого размера, это будет работать, но если вы пытаетесь что-то использовать в течение длительного времени,Возможно, вы захотите придумать более элегантный способ сделать это.