Согласно Javadoc LinkedHashSet, он будет сохраняйте порядок вставки вставляемых элементов, используя внутренне двусвязный список.
он поддерживает двусвязный список, охватывающий все его записи. Этот связанный список определяет порядок итераций, то есть порядок, в котором элементы были вставлены в набор (порядок вставки).
Если я хочу получить первый вставленный элемент, я могу использовать такой код:
linkedHashSet.iterator().next()
Это даст мне первый вставленный элемент в наборе в O (1).
Я пытаюсь решить проблему, которая требует от меня доступа к самому последнему вставленному элементу в набор в O (1), и предположим, что в набор не будет вставлен какой-либо дублированный элемент. Например,
linkedHashSet.add(2); // the most recent inserted element in the set is 2
linkedHashSet.add(3); // the most recent inserted element in the set is 3
linkedHashSet.add(5); // the most recent inserted element in the set is 5
linkedHashSet.remove(5); // the most recent inserted element in the set is 3 because 5 is removed and not in the set now
Поскольку это двусвязный список в наборе, кажется, что самый последний элемент должен быть последним в двусвязном списке и должен иметь возможность доступа в O (1), если есть какой-то API для его получения.
Мой вопрос: есть ли способ сделать это в JDK или мне нужно создать свой собственный ReversedIteratingLinkedHashSet для этого?
По сути, я пытаюсь найти структуру данных Set с временной сложностью O (1) для всех операций, включая: вставку / удаление / поиск / проверку самого последнего вставленного элемента в наборе. Встроенный LinkedHashSet кажется хорошо сочетающимся с очень небольшой внутренней модификацией, но я не уверен, можно ли это сделать с помощью API класса JDK по умолчанию или нет.
Примечание: я проверил исходный код JDK и знаю, что LinkedHashSet внутренне реализован с помощью LinkedHashMap, и если есть какое-либо решение, которое могло бы использовать LinkedHashMap для доступа к самому последнему вставленному элементу в O (1), это тоже полезно для меня.
Большое спасибо.