Java LinkedHashSet использует двусвязный список. Может ли оно быть повторено в обратном направлении? - PullRequest
1 голос
/ 01 апреля 2020

Oracle -Документация говорит следующее о LinkedHashSet: «Ha sh реализация таблицы и связанного списка интерфейса Set с предсказуемым порядком итераций. Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записей. "

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

Можно ли создать такой обратный итератор (или даже ListIterator, который выполняет оба действия)?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Итератор LinkedHashMap поддерживает только движение вперед. Вы можете прочитать его реализацию в OpenJDK в зеркале github . Это не похоже на реализацию, реализованную в частном порядке ListIterator и тайно поддерживаемую итерацию в обратном направлении.

Поиск таблицы ha sh дает вам указатель на запись, которая находится где-то в списке. Чтобы удалить его, вам нужна ссылка на предыдущую запись списка. Вот почему LinkedHashMap должен использовать двусвязный список.

0 голосов
/ 01 апреля 2020

LinkedHashSet не предоставляет API для итерации по нему в обратном направлении. Хотя это сильно ухудшит производительность, вы можете скопировать LinkedHashSet в List (сохранив его порядок) и затем выполнить итерацию в обратном направлении:

LinkedHashSet<SomeClass> myLinkedHashSet = ...;
List<SomeClass> myList = new ArrayList<>(myLinkedHashSet); // Order is retained
ListIterator<SomeClass> myIter = myList.listIterator(myList.size());
while (myIter.hasPrevious()) {
    System.out.println(myIter.previous());
}
...