Si alguien está familiarizado con Objective-C, hay una colección llamada NSOrderedSet
que actúa como Set y se puede acceder a sus elementos como los de un Array .
¿Hay algo parecido a esto en Java?
Escuché que hay una colección llamada LinkedHashMap
, pero no he encontrado nada parecido para un set.
java
collections
set
Uko
fuente
fuente
Respuestas:
Eche un vistazo a la clase LinkedHashSet
Desde el documento de Java :
Implementación de tabla hash y lista vinculada de la interfaz Set, con orden de iteración predecible . Esta implementación se diferencia de HashSet en que mantiene una lista doblemente enlazada que se ejecuta en todas sus entradas. Esta lista enlazada define el orden de iteración, que es el orden en el que se insertaron los elementos en el conjunto (orden de inserción) . Tenga en cuenta que el orden de inserción no se ve afectado si un elemento se vuelve a insertar en el conjunto . (Un elemento e se vuelve a insertar en un conjunto s si se invoca s.add (e) cuando s.contains (e) devolvería verdadero inmediatamente antes de la invocación).
fuente
LinkedHashMap
pero no lo he encontrado de alguna manera.LinkedHashSet
que le permita averiguar en qué índice también se encuentra el elemento.Cada conjunto tiene un iterador (). El iterador de un HashSet normal es bastante aleatorio, un TreeSet lo hace por orden de clasificación, un iterador LinkedHashSet itera por orden de inserción.
Sin embargo, no puede reemplazar un elemento en un LinkedHashSet. Puede eliminar uno y agregar otro, pero el nuevo elemento no estará en el lugar del original. En un LinkedHashMap, puede reemplazar un valor de una clave existente, y luego los valores seguirán en el orden original.
Además, no puede insertar en una posición determinada.
Tal vez sea mejor que use una ArrayList con una verificación explícita para evitar insertar duplicados.
fuente
LinkedHashSet
debería hacer eso. Gracias por la respuestaEche un vistazo al documento API estándar de Java . Justo al lado
LinkedHashMap
, hay unLinkedHashSet
. Pero tenga en cuenta que el orden en esos es el orden de inserción, no el orden natural de los elementos. Y solo puede iterar en ese orden, no hacer acceso aleatorio (excepto contando los pasos de iteración).También hay una interfaz
SortedSet
implementada porTreeSet
yConcurrentSkipListSet
. Ambos permiten la iteración en el orden natural de sus elementos o unComparator
, pero no el acceso aleatorio o el orden de inserción.Para una estructura de datos que tenga acceso eficiente por índice y pueda implementar de manera eficiente el criterio establecido, necesitaría una lista de omisión , pero no hay implementación con esa funcionalidad en la API estándar de Java, aunque estoy seguro de que es fácil encontrar una. En Internet.fuente
ConcurrentSkipListMap
yConcurrentSkipListSet
. Ambos mantienen una ordenación basada en el orden natural o un Comparador. No entiendo si proporcionan el acceso aleatorio o el orden de entrada que comenta.TreeSet
está ordenado.http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html
fuente
Intente usar
java.util.TreeSet
esos implementosSortedSet
.Para citar el doc:
Tenga en cuenta que agregar, quitar y contiene tiene un registro de costo de tiempo (n).
Si desea acceder al contenido del conjunto como una matriz, puede convertirlo haciendo:
Esta matriz se ordenará con los mismos criterios que el TreeSet (natural o por un comparador), y en muchos casos esto tendrá una ventaja en lugar de hacer un Arrays.sort ()
fuente
c
y luego elementoa
, ya que iterar sobre una colección que quiero conseguir en el mismo orden:c
,a
etctreeset es un conjunto ordenado, pero no puede acceder a través de un índice de elementos, simplemente iterar o ir al principio / final.
fuente
Si estamos hablando de una implementación económica de la lista de omisión, me pregunto en términos de gran O, cuál es el costo de esta operación:
Quiero decir que siempre se queda atascado en una creación de matriz completa, por lo que es O (n):
fuente
size()
método del conjunto subyacente. La iteración suele serO(n)
, el tamaño suele serO(1)
exceptoConcurrentSkipListSet
donde estáO(n)
.IndexedTreeSet del proyecto indexed-tree-map proporciona esta funcionalidad (conjunto ordenado / ordenado con acceso tipo lista por índice).
fuente
También puede obtener alguna utilidad de un mapa bidireccional como el
BiMap
de Google GuavaCon a
BiMap
, puede asignar de manera bastante eficiente un entero (para acceso de índice aleatorio) a cualquier otro tipo de objeto.BiMap
s son uno a uno, por lo que cualquier número entero tiene, como máximo, un elemento asociado y cualquier elemento tiene un número entero asociado. Está inteligentemente respaldado por dosHashTable
instancias, por lo que usa casi el doble de memoria, pero es mucho más eficiente que una costumbreList
en cuanto al procesamiento porquecontains()
(que se llama cuando se agrega un elemento para verificar si ya existe) es un tiempo constante y operación amigable en paralelo comoHashSet
's, mientras queList
la implementación de' es MUCHO más lenta.fuente
Tuve un problema similar. No necesitaba un conjunto ordenado, sino más bien una lista con un
indexOf
/contains
. Como no encontré nada, implementé uno yo mismo. Aquí está el código, implementa ambosSet
yList
, aunque no todas las operaciones de lista masiva son tan rápidas como lasArrayList
versiones.descargo de responsabilidad: no probado
fuente