Java - Проектирование структуры данных - Фиксированный размер, произвольный доступ, потокобезопасность, отсортированная коллекция - PullRequest
0 голосов
/ 28 сентября 2019

Итак, в каком-то вопросе мне потребовалось реализовать следующее: структура данных фиксированного размера (n = 10), которая всегда упорядочена (по убыванию, не имеет значения), безопасна для потоков и поддерживает произвольный доступ.

Мое решение было - используя TreeSet, при каждом добавлении элемента, если уже есть элементы n, удалите наименьший элемент (если новый элемент больше его) и добавьте новый элемент.В противном случае просто добавьте новый элемент.При доступе к случайному индексу используйте итератор TreeSet для итерации до получения необходимого индекса.

Мне не очень нравится это решение.Поэтому я подумал о другом решении: использовать ArrayList, построенный с размером n.Всякий раз, когда вы пытаетесь добавить элемент, выполните Collections.binarySearch() для элемента и вставьте его, если он не существует, используя индекс, возвращенный из binarySearch.Если после добавления элемента длина списка больше n (на самом деле равна n+1), удалите наименьший элемент (который находится в конце списка).Таким образом, мы получаем log (n) для добавления (так же, как TreeSet из предыдущего решения), и произвольный доступ равен O (1).Единственное, что мне не нравится в этом, это то, что add() для произвольного индекса в середине списка требует сдвига всех элементов после него.(хорошо работает для маленьких n, но для больших n, может быть, нет?)

Для обоих решений я использую ReentrantReadWriteLock - приобретаем writeLock () для add и readLock () для операций get () / read.

Есть ли лучшее решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...