В частности, мне нужна коллекция, которая использует одно поле A для доступа и другое (поле S) для сортировки, но достаточно отсортированной коллекции, которая принимает дубликат.
Я часто бываю в этой точке, где мне нужна именно эта коллекция, и TreeMap не является вариантом, поскольку он не позволяет дублировать. Так что теперь настало время спросить здесь. Есть несколько обходных путей, как указано в stackoverflow здесь и здесь - а именно:
- PriorityQueue: медленное обновление (удалить (объект) + добавить (объект)) и бокс примитивных клавиш
- Куча Фибоначчи: отходы памяти (?)
-
TreeMap<Field_S, List<Value>>
: проблема для меня - это издержки памяти в списке и бокс примитивных клавиш - отсортированный список или массив: проблема - медленная вставка и удаление → следует ли реализовать один сегментированный отсортированный список?
- TreeMultimap из guava (docs): внешняя зависимость и, возможно, неэффективная память (?)
Кто-нибудь с лучшими предложениями? Или я должен использовать свою собственную сортированную структуру данных (какая?)? Также были бы полезны другие источники (в Java, с открытым исходным кодом, с модульными тестами и малыми папками).
Обновление
Более подробная информация о моем случае использования на данный момент (хотя у меня такой же спрос в последний раз). У меня есть коллекция (с миллионами) ссылок, где я хочу быть в состоянии
- для опроса или получения наименьшего элемента относительно поля S
- и обновить поле S с помощью поля A
- могут иметь место одинаковые значения поля S. поле A на самом деле является целым числом, указывающим на другой массив
- Единственная зависимость, которую я хочу, это trove4j. Я мог бы использовать другие, подобные коллекциям mahout, если это потребуется. Но не guava, как хорошая библиотека, не настроены на эффективную память (бокс/распаковка).
Итак, все крики для кучи фибоначчи, но я боюсь, что слишком много накладных расходов на элемент → вот почему я подумал о более эффективном решении "отсортированного + сегментированного массива" с большей памятью.