Si quelqu'un est familier avec Objective-C, il existe une collection appelée NSOrderedSet
qui agit comme Set et ses éléments sont accessibles comme ceux d'un Array .
Y a-t-il quelque chose comme ça en Java?
J'ai entendu dire qu'il y avait une collection appelée LinkedHashMap
, mais je n'ai rien trouvé de semblable pour un ensemble.
java
collections
set
Uko
la source
la source
Réponses:
Jetez un œil à la classe LinkedHashSet
Depuis Java doc :
Implémentation de table de hachage et de liste liée de l'interface Set, avec ordre d'itération prévisible . Cette implémentation diffère de HashSet en ce qu'elle maintient une liste à double lien parcourant toutes ses entrées. Cette liste chaînée définit l'ordre des itérations, qui est l'ordre dans lequel les éléments ont été insérés dans l'ensemble (ordre d'insertion) . Notez que l'ordre d'insertion n'est pas affecté si un élément est réinséré dans l'ensemble . (Un élément e est réinséré dans un ensemble s si s.add (e) est invoqué alors que s.contains (e) renverrait true immédiatement avant l'invocation.).
la source
LinkedHashMap
mais je ne l'ai pas trouvé d'une manière ou d'une autre.LinkedHashSet
qui vous permet de déterminer dans quel index se trouve l'élément.Chaque ensemble a un itérateur (). L'itérateur d'un HashSet normal est assez aléatoire, un TreeSet le fait par ordre de tri, un itérateur LinkedHashSet itère par ordre d'insertion.
Cependant, vous ne pouvez pas remplacer un élément dans un LinkedHashSet. Vous pouvez en supprimer un et en ajouter un autre, mais le nouvel élément ne sera pas à la place de l'original. Dans un LinkedHashMap, vous pouvez remplacer une valeur pour une clé existante, puis les valeurs seront toujours dans l'ordre d'origine.
De plus, vous ne pouvez pas insérer à une certaine position.
Vous feriez peut-être mieux d'utiliser une ArrayList avec une vérification explicite pour éviter d'insérer des doublons.
la source
LinkedHashSet
devrait faire cela. Merci pour la réponseJetez un œil à la documentation de l'API standard Java . Juste à côté
LinkedHashMap
, il y a un fichierLinkedHashSet
. Mais notez que l'ordre dans ceux-ci est l'ordre d'insertion, pas l'ordre naturel des éléments. Et vous ne pouvez itérer que dans cet ordre, pas d'accès aléatoire (sauf en comptant les étapes d'itération).Il existe également une interface
SortedSet
implémentée parTreeSet
etConcurrentSkipListSet
. Les deux permettent l'itération dans l' ordre naturel de leurs éléments ou dans unComparator
ordre d'accès ou d'insertion aléatoire, mais pas.Pour une structure de données qui a à la fois un accès efficace par index et peut mettre en œuvre efficacement le critère défini, vous auriez besoin d'un liste de sauts , mais il n'y a pas d'implémentation avec cette fonctionnalité dans l'API Java Standard, même si je suis certain qu'il est facile d'en trouver une sur Internet.la source
ConcurrentSkipListMap
etConcurrentSkipListSet
. Les deux maintiennent un tri basé sur l'ordre naturel ou un comparateur. Je ne comprends pas s'ils fournissent l'accès aléatoire ou l'ordre d'entrée dont vous parlez.TreeSet
est commandé.http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html
la source
Essayez d'utiliser
java.util.TreeSet
ces outilsSortedSet
.Pour citer la doc:
Notez que ajouter, supprimer et contient a un journal de coût en temps (n).
Si vous souhaitez accéder au contenu de l'ensemble en tant que tableau, vous pouvez le convertir en:
Ce tableau sera trié avec les mêmes critères que le TreeSet (naturel ou par un comparateur), et dans de nombreux cas cela aura un avantage au lieu de faire un Arrays.sort ()
la source
c
et élémenta
, comme je itérer sur une collection que je veux les obtenir dans le même ordre:c
,a
etc.treeet est un ensemble ordonné, mais vous ne pouvez pas accéder via un index d'éléments, il suffit de parcourir ou d'aller au début / à la fin.
la source
Si on parle de mise en œuvre peu coûteuse de la skip-list, je me demande en terme de big O, quel est le coût de cette opération:
Je veux dire qu'il est toujours coincé dans une création de tableau entier, donc c'est O (n):
la source
size()
méthode de l'ensemble sous-jacent. L'itération est généralementO(n)
, la taille est généralementO(1)
saufConcurrentSkipListSet
là où elle estO(n)
.IndexedTreeSet du projet indexed -tree-map fournit cette fonctionnalité (ensemble ordonné / trié avec accès de type liste par index).
la source
Vous pouvez également tirer parti d'une carte bidirectionnelle comme celle
BiMap
de Google GuavaAvec a
BiMap
, vous pouvez mapper assez efficacement un entier (pour un accès d'index aléatoire) à n'importe quel autre type d'objet.BiMap
s sont un-à-un, donc tout entier donné a, au plus, un élément associé, et tout élément a un entier associé. Il est intelligemment soutenu par deuxHashTable
instances, donc il utilise presque le double de la mémoire, mais c'est beaucoup plus efficace qu'unList
traitement personnalisé en ce qui concerne le traitement carcontains()
(qui est appelé lorsqu'un élément est ajouté pour vérifier s'il existe déjà) est un temps constant et un fonctionnement parallèle comme celui deHashSet
's, tandis queList
la mise en œuvre de' s est BEAUCOUP plus lente.la source
J'avais un problème similaire. Je n'avais pas vraiment besoin d'un ensemble ordonné mais plutôt d'une liste avec un
indexOf
/contains
. Comme je n'ai rien trouvé là-bas, j'en ai implémenté un moi-même. Voici le code, il implémente les deuxSet
etList
, bien que toutes les opérations de liste en bloc ne soient pas aussi rapides que leArrayList
versions.avertissement: non testé
la source