Если кто-нибудь знаком с Objective-C, существует коллекция, NSOrderedSet
которая действует как Set, и к ее элементам можно обращаться как к элементам Array .
Есть ли что-нибудь подобное в Java?
Я слышал, что есть такая коллекция LinkedHashMap
, но я не нашел ничего подобного для набора.
java
collections
set
Uko
источник
источник
Ответы:
Взгляните на класс LinkedHashSet
Из документа Java :
Реализация хэш-таблицы и связанного списка интерфейса Set с предсказуемым порядком итераций . Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итераций, то есть порядок, в котором элементы были вставлены в набор (порядок вставки) . Обратите внимание, что порядок вставки не изменяется, если элемент повторно вставляется в набор . (Элемент e повторно вставляется в набор s, если s.add (e) вызывается, когда s.contains (e) вернет true непосредственно перед вызовом.).
источник
LinkedHashMap
но я почему-то не нашел.LinkedHashSet
, позволяющей определить, в каком индексе находится элемент.В каждом наборе есть итератор (). Нормальный HashSet это итератор довольно случайным образом , TreeSet делает это порядок сортировки, в LinkedHashSet итератора итерацию по заказу вставки.
Однако вы не можете заменить элемент в LinkedHashSet. Вы можете удалить один и добавить другой, но новый элемент не будет на месте оригинала. В LinkedHashMap вы можете заменить значение существующего ключа, и тогда значения останутся в исходном порядке.
Кроме того, вы не можете вставить в определенную позицию.
Возможно, вам лучше использовать ArrayList с явной проверкой, чтобы не вставлять дубликаты.
источник
LinkedHashSet
должно сработать. Спасибо за ответВзгляните на стандартную документацию API Java . Рядом
LinkedHashMap
находится значокLinkedHashSet
. Но обратите внимание, что порядок в них - это порядок вставки, а не естественный порядок элементов. И вы можете выполнять итерацию только в этом порядке, а не выполнять произвольный доступ (кроме подсчета шагов итерации).Также существует интерфейс,
SortedSet
реализованныйTreeSet
иConcurrentSkipListSet
. Оба допускают итерацию в естественном порядке их элементов или аComparator
, но не в произвольном порядке доступа или в порядке вставки.Для структуры данных, которая имеет как эффективный доступ по индексу, так и может эффективно реализовать установленный критерий, вам понадобится список пропуска , но в стандартном API Java нет реализации с этой функциональностью, хотя я уверен, что ее легко найти. в интернете.источник
ConcurrentSkipListMap
иConcurrentSkipListSet
. Оба поддерживают сортировку на основе естественного порядка или компаратора. Я не понимаю, обеспечивают ли они произвольный доступ или порядок входа, о котором вы говорите.TreeSet
заказан.http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html
источник
Попробуйте использовать
java.util.TreeSet
эти орудияSortedSet
.Процитирую документ:
Обратите внимание, что add, remove и contains имеют журнал затрат времени (n).
Если вы хотите получить доступ к содержимому набора в виде массива, вы можете преобразовать его, выполнив:
Этот массив будет отсортирован по тем же критериям, что и TreeSet (естественный или компаратор), и во многих случаях это будет иметь преимущество вместо выполнения Arrays.sort ()
источник
c
а затем элементa
, когда я перебираю коллекцию, я хочу получить их в том же порядке:c
иa
т. Д.treeset - это упорядоченный набор, но вы не можете получить доступ через индекс элементов, просто выполните итерацию или перейдите в начало / конец.
источник
Если мы говорим о недорогой реализации skip-list, мне интересно, в терминах большого O, какова стоимость этой операции:
Я имею в виду, что он всегда застревает при создании всего массива, поэтому это O (n):
источник
size()
метода базового набора. Итерация обычноO(n)
, размер обычноO(1)
за исключением того,ConcurrentSkipListSet
где онO(n)
.IndexedTreeSet из проекта indexed-tree-map обеспечивает эту функциональность (упорядоченный / отсортированный набор со списковым доступом по индексу).
источник
Вы также можете получить некоторую полезность из двунаправленной карты, например
BiMap
из Google GuavaС помощью a
BiMap
вы можете довольно эффективно сопоставить целое число (для произвольного доступа к индексу) с любым другим типом объекта.BiMap
s взаимно однозначны, поэтому с любым заданным целым числом связан не более одного элемента, а с любым элементом связано одно целое число. Он умно подкреплен двумяHashTable
экземплярами, поэтому он использует почти вдвое больше памяти, но он намного более эффективен, чем пользовательский,List
в том, что касается обработки, потому чтоcontains()
(который вызывается, когда элемент добавляется, чтобы проверить, существует ли он уже), является постоянным временем и параллельная операция, такая какHashSet
s, в то время какList
реализация выполняется НАМНОГО медленнее.источник
У меня была похожая проблема. Мне не совсем нужен был упорядоченный набор, а скорее список с быстрым
indexOf
/contains
. Поскольку я ничего там не нашел, я реализовал один сам. Вот код, он реализует обаSet
иList
, хотя не все операции с массовым списком работают так же быстро, какArrayList
версии.отказ от ответственности: не проверено
источник