7
votes

Collection avec index et accès hachage

J'ai besoin d'une classe de collection qui a à la fois: index rapide et accès à hachage. Maintenant j'ai une arraylist. Il a de bonnes accessoires d'index, mais son contient la méthode n'est pas performant. Hashset a bon contient implémentation mais aucun accès indexé. Quelle collection a les deux? Probablement quelque chose d'Apache? Ou devrais-je créer ma propre classe de collection qui a les deux: ArrayList pour les accès indexés et HASHSET pour contient check?

juste pour clarification: j'ai besoin des deux get (int index) et contient (objet o)


3 commentaires

Vous possédez une structure de données contenant à la fois (ou une variation de cela) est probablement la voie à suivre.


Pouvez-vous expliquer pourquoi vous voulez cela?


Oui je peux. J'ai un code hérité, qui utilise presque toutes les méthodes d'un objet de liste (arraylist). Je n'ai aucune chance de le réécrire, mais je veux augmenter ses performances. Le problème principal ici est contenant et indice des méthodes car ils ont des performances linéaires.


4 Réponses :


0
votes

Si vous parcourez l'index du début à la fin, je pense que cela pourrait satisfaire à vos besoins: linkedhashset

Si vous avez besoin d'accéder au hasard via l'index, ainsi que de l'accès au hachage, si personne d'autre d'autre a une meilleure suggestion, je suppose que vous pouvez créer votre propre collection qui fait les deux.


4 commentaires

Autant que je sache, l'accès indexé serait O (n) , qui n'est pas particulièrement efficace.


LinkedHashSet n'a pas de méthode 'get (int index)'


@Sergiymedvynskyy Oui, mais vous pouvez utiliser l'itérateur pour la simuler.


Bien sûr, mais dans ce cas, j'aurai le même goulot d'étranglement de la performance sur un autre endroit.



1
votes

Si la performance d'accès indexée n'est pas un problème, le match le plus proche est linkedhashset, dont l'API dit qu'il est

Tableau de hachage et mise en œuvre de la liste liée de l'interface SET, avec ordre d'itération prévisible.

Au moins, je ne pense pas que la performance sera pire que celle de LinkedListpercance. Sinon, je ne peux voir aucune alternative mais votre arraylist + Solution Hashtable


1 commentaires

Je ne suis pas sûr que c'est vraiment mieux



0
votes

faire comme ça; Utilisez la combinaison de Technique de hachage forte> ainsi que Liste forte> pour obtenir le meilleur des deux mondes :) xxx pré>

donc objet; Vous gardez dans hashmap / hashset fort> ainsi que arraylist strong>. p>

Donc, si vous souhaitez utiliser P>

 contains method : call hashed contains method.

 get an object with index: use array to return the value


1 commentaires

C'est la dernière échappatoire que j'utiliserais, si je ne peux pas trouver quelque chose de mieux



0
votes

Je ne connais pas les temps de recherche exacts, mais vous pourriez peut-être utiliser une implémentation de la interface de la carte . Vous pouvez stocker des objets avec map.put (objetHash, obj) code>.

Vous pouvez également vérifier que vous avez un certain objet avec: p>

MyObject object = map.get(objectHash);


3 commentaires

ContainsValue pour HASHMAP a la même performance que celle de la liste - le linéaire. Je souhaite le logarithmique (si possible bien sûr).


@Sergiymedvynskyy ahh, je n'étais pas au courant de cela. Avez-vous une référence à l'endroit où vous avez découvert cela?


Voir simplement la mise en œuvre de HASHMAP. Méthode contientValue iTerates sur toutes les entrées et vérifie l'égalité comme la méthode de la flambée.