20 votes

Comment obtenir la clé et la valeur d'un TreeMap à un index particulier ?

J'ai un TreeMap avec un ensemble de paires "Clé et Valeur". Comment puis-je obtenir à la fois la clé et la valeur à un index particulier de l'arborescence ?

EDIT : @TO-ALL : Merci. Mais je sais comment l'implémenter en utilisant une ArrayList supplémentaire. J'ai juste pensé qu'il y avait un moyen de réaliser cela sans utiliser une ArrayList supplémentaire.

26voto

Chandra Points 482

Si vous voulez vraiment utiliser TreeMap et obtenir par position, vous pouvez utiliser ce qui suit :

key => treemap.keySet().toArray()[0]
value => treemap.get(key); 

OU (si vous voulez simplement de la valeur)

treemap.values().toArray()[0]; 

Mais je vous suggère d'utiliser un itérateur, car dans la méthode ci-dessus, il faut créer un tableau chaque fois que vous voulez trouver (donc pas si efficace) et aussi vous devez être assez prudent pour vous assurer que l'indice ne va pas hors de portée.

8voto

Booyah Johnson Points 91

Tout d'abord, je ne sais pas pourquoi les gens ici s'inquiètent si souvent de la validité d'une question. Il y a de nombreux cas où les gens ont jugé bon de maintenir une ArrayList en ordre trié. Maintenir une ArrayList en ordre trié est grossièrement inefficace pour les grandes listes.

Les nœuds d'entrée de la distribution source standard Java (Oracle) ne conservent pas la taille de leurs arbres descendants. De ce fait, il n'est pas possible d'identifier un élément dans la carte par index sans une recherche séquentielle inefficace.

Je trouve cet inconvénient si grave que j'ai écrit ma propre carte AVL qui peut efficacement obtenir des éléments par index et calculer indexOf(E). Rendre cela possible est aussi simple que de maintenir les tailles de chacune des branches gauche et droite d'une entrée. Il y a une chance que la bibliothèque Glazedlists ait un arbre consultable intégré quelque part. Vous pourriez souhaiter l'examiner.

6voto

Alexei Kaigorodov Points 5841

Vous pouvez copier un ensemble d'entrées dans une liste de tableaux et ensuite obtenir l'entrée désirée par index :

list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);

Mais a) la copie prend O(N) temps et b) lorsque treeMap change, la liste devient invalide.

2voto

Ce n'est peut-être pas la meilleure solution, mais vous pourrez accéder à votre clé/valeur à un index particulier.

TreeMap<Object, Object> foo = new TreeMap<Object, Object>();
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX];
Object value = foo.get(key);

1voto

Vineet Agarwal Points 51

Cela pourrait être utile

TreeMap< String,Integer > ht=new TreeMap<>();

ht.put("12",1);
ht.put("22",2);
ht.put("32",3);
ht.put("42",4);
for(int i=0;i<ht.size();i++)
{
   System.out.println(new Vector(ht.keySet()).get(i));
   System.out.println(new Vector(ht.values()).get(i));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X