J'ai utilisé LinkedHashMap
car il est important de l'ordre dans lequel les clés sont entrées dans la carte.
Mais maintenant, je veux obtenir la valeur de la clé en premier lieu (la première entrée entrée) ou en dernier.
Devrait-il y avoir une méthode comme first()
et last()
ou quelque chose comme ça?
Dois-je avoir un itérateur pour obtenir simplement la première entrée de clé? C'est pourquoi j'ai utilisé LinkedHashMap
!
Merci!
java
dictionary
linkedhashmap
maiky
la source
la source
Réponses:
La sémantique de
LinkedHashMap
est toujours celle d'une Map, plutôt que celle de aLinkedList
. Il conserve l'ordre d'insertion, oui, mais c'est un détail d'implémentation, plutôt qu'un aspect de son interface.Le moyen le plus rapide d'obtenir la "première" entrée est toujours
entrySet().iterator().next()
. Obtenir la «dernière» entrée est possible, mais impliquera une itération sur tout le jeu d'entrées en appelant.next()
jusqu'à ce que vous atteigniez la dernière.while (iterator.hasNext()) { lastElement = iterator.next() }
edit : Cependant, si vous êtes prêt à aller au-delà de l'API JavaSE, Apache Commons Collections a sa propre
LinkedMap
implémentation, qui a des méthodes commefirstKey
etlastKey
, qui font ce que vous recherchez. L'interface est considérablement plus riche.la source
mylinkedmap.entrySet().iterator().next()
complexité temporelle? Est-ce O (1)?Pouvez-vous essayer de faire quelque chose comme (pour obtenir la dernière entrée):
la source
T last = null ; for( T item : linkedHashMap.values() ) last = item;
Ou quelque chose comme ça. C'est O (N) dans le temps mais O (1) en mémoire.Je sais que je suis arrivé trop tard mais je voudrais proposer des alternatives, pas quelque chose d'extraordinaire mais des cas qu'aucun d'entre eux n'a mentionnés ici. Dans le cas où quelqu'un ne se soucie pas tellement de l'efficacité mais qu'il veut quelque chose avec plus de simplicité (peut-être trouver la dernière valeur d'entrée avec une ligne de code), tout cela sera assez simplifié avec l'arrivée de Java 8 . Je propose quelques scénarios utiles.
Par souci d'exhaustivité, je compare ces alternatives avec la solution de tableaux déjà mentionnée dans cet article par d'autres utilisateurs. Je résume tous les cas et je pense qu'ils seraient utiles (quand les performances comptent ou pas) surtout pour les nouveaux développeurs, cela dépend toujours de la question de chaque problème
Alternatives possibles
Utilisation de la méthode Array
Je l'ai pris de la réponse précédente pour faire les comparaisons suivantes. Cette solution appartient à @feresr.
Utilisation de la méthode ArrayList
Similaire à la première solution avec des performances un peu différentes
Méthode de réduction
Cette méthode réduira l'ensemble des éléments jusqu'à obtenir le dernier élément du flux. De plus, il ne retournera que des résultats déterministes
SkipFunction, méthode
Cette méthode obtiendra le dernier élément du flux en sautant simplement tous les éléments avant
Alternative itérable
Voici le code source complet
Voici la sortie avec les performances de chaque méthode
la source
LinkedHashMap
l'implémentation actuelle (Java 8) garde une trace de sa queue. Si les performances sont un problème et / ou que la carte est de grande taille, vous pouvez accéder à ce champ par réflexion.Étant donné que la mise en œuvre peut changer, il est probablement judicieux d'avoir également une stratégie de secours. Vous souhaiterez peut-être enregistrer quelque chose si une exception est levée afin de savoir que l'implémentation a changé.
Cela pourrait ressembler à:
la source
ClassCastException
aucatch
cas où cetail
n'est pas uneEntry
sous-classe (ou une implémentation future).Une autre façon d'obtenir la première et la dernière entrée d'un LinkedHashMap est d'utiliser la méthode "toArray" de l'interface Set.
Mais je pense qu'itérer les entrées du jeu d'entrées et obtenir la première et la dernière entrée est une meilleure approche.
L'utilisation des méthodes de tableau conduit à un avertissement de la forme "... nécessite une conversion non cochée pour se conformer à ..." qui ne peut pas être corrigé [mais ne peut être supprimé qu'en utilisant l'annotation @SuppressWarnings ("non cochée")].
Voici un petit exemple pour illustrer l'utilisation de la méthode "toArray":
la source
C'est un peu sale, mais vous pouvez remplacer la
removeEldestEntry
méthode de LinkedHashMap, ce qu'elle pourrait vous convenir de faire en tant que membre anonyme privé:Ainsi, vous pourrez toujours obtenir la première entrée chez votre
eldest
membre. Il sera mis à jour chaque fois que vous effectuez unput
.Il devrait également être facile de remplacer
put
et de définiryoungest
...Tout cela tombe en panne lorsque vous commencez à supprimer des entrées; Je n'ai pas trouvé un moyen de dissiper cela.
C'est très ennuyeux que vous ne puissiez pas autrement accéder à la tête ou à la queue de manière sensée ...
la source
Peut-être quelque chose comme ça:
la source
Suggestion:
la source
Je recommanderais d'utiliser ConcurrentSkipListMap qui a
firstKey()
etlastKey()
méthodesla source
Pour le premier élément, utilisez
entrySet().iterator().next()
et arrêtez l'itération après 1 itération. Pour le dernier, le moyen le plus simple est de conserver la clé dans une variable chaque fois que vous effectuez un map.put.la source
Bien que linkedHashMap ne fournisse aucune méthode pour obtenir le premier, le dernier ou un objet spécifique.
Mais c'est assez trivial à obtenir:
Set al = orderMap.keySet ();
utilisant maintenant l'itérateur sur un objet; vous pouvez obtenir n'importe quel objet.
la source
Oui je suis tombé sur le même problème, mais heureusement je n'ai besoin que du premier élément ... - C'est ce que j'ai fait pour cela.
Si vous avez également besoin du dernier élément - je vais voir comment inverser l'ordre de votre carte - stockez-le dans une variable temporaire, accédez au premier élément de la carte inversée (ce serait donc votre dernier élément), tuez le variable de température.
Voici quelques bonnes réponses sur la façon d'inverser l'ordre d'un hashmap:
Comment itérer hashmap dans l'ordre inverse en Java
Si vous utilisez l'aide du lien ci-dessus, veuillez leur donner des votes positifs :) J'espère que cela peut aider quelqu'un.
la source
à droite, vous devez énumérer manuellement le jeu de clés jusqu'à la fin de la liste liée, puis récupérer l'entrée par clé et renvoyer cette entrée.
la source
la source