Ваш компаратор не будет работать: он не обеспечивает транзитивность, то есть он будет работать неправильно, если вы сравните элементы A и C в случае A-> B-> C.
Если ни один элемент не может иметь такой же предыдущий элемент, ваши Item
объекты по существу образуют базовый связанный список. Если вам известно, что это последний элемент, вы можете начать с одного цикла и распутать всю структуру:
Item last = ...;
while (last != null) {
result.add(last)
last = last.previousItem
}
Если у вас нет способа узнать, какой элемент является последним, вы можете использовать IdentityHashMap
, чтобы сопоставить каждое значение previousItem
с объектом Item
, который его использует :
IdentityHashMap<Item,Item> m = new IdentityHashMap<Item,Item>(itemset.size());
for (Item i : itemset)
m.put(i.previousItem, i);
Item i = m.get(null);
while (i != null) {
result.add(i);
i = m.get(i);
}
Это распутает вашу несортированную коллекцию, начиная с элемента, у которого нет предыдущего узла.
Оба метода имеют приблизительно линейную сложность w.r.t. количество предметов, но они делают два предположения, которые могут быть недействительными в вашем случае:
То, что каждый элемент может быть только предыдущим элементом не более одного другого узла, т. Е. Что ваши элементы представляют собой список вместо дерева.
То, что существует одна «нить» предметов.
Если какое-либо из этих предположений неверно, вам потребуется гораздо более сложный алгоритм, чтобы разобраться в этом.