Obtenir minvalue d'une Carte(Clé,Double)
Est-il une méthode (peut-être avec Google Collections) pour obtenir la valeur min de un Map(Key, Double)
?
De façon traditionnelle, il faudrait que je sorte la carte, en fonction des valeurs, et de prendre la première/dernière.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser la norme
Collections#min()
pour cela.Mise à jour: depuis que vous avez besoin de la clé ainsi, eh bien, je ne vois pas les moyens de
Collections
ou GoogleCollections2
API depuis unMap
n'est pas unCollection
. LeCartes#filterEntries()
est pas vraiment utile, puisque vous ne connaissez que le résultat réel à fin de l'itération.Plus simple solution serait alors de ceci:
(nullcheck sur
min
laissé de côté)List<SomeObject>
au lieu de cela, en combinaison avec unComparator<SomeObject>
ou peut-êtreComparable<SomeObject>
. LeSomeObject
tour, puis maintenez la carte originale, une clé et une valeur. UnSet<SomeObject>
peut également être adapté, vous n'aurez qu'à compter de l'index vous-même.Vous pouvez toujours utiliser
Collections.min
avec une coutumeComparator
pour obtenir leMap.Entry
avec la valeur la plus faible:Avec Java 8:
Non, vous ne le soit pas. Vous devez parcourir toutes les valeurs et à chaque étape, de comparer l'état actuel de l'élément avec le plus petit vu jusqu'à présent. C'est O(n), par rapport à O(n*log(n)) pour le tri, ce qui pourrait être énorme différence.
BTW, c'est exactement comment
Collections.min()
œuvres.À l'aide de Java 8 flux:
Ou
Mais si vous voulez le faire à plusieurs reprises, sans aucun doute donner à tas un coup d'oeil.
Je serais enclin à utiliser un Google Collections BiMap:
Ou quelque chose comme ça (pas testé).
Java8 One-Liner
Afin de le faire de manière efficace, vous pouvez définir votre propre structure de données, telle qu'elle implémente l'interface de la Carte,mais permet aussi efficace getMin() de l'opération.
Cela peut être fait à l'aide de deux structures de données internes: une carte et un arbre (ou d'un segment de données de la structure). Chaque fois qu'une nouvelle paire (K,V) est ajouté, les ajouter à la carte, et aussi à l'arbre (comme une seule entrée). Cela permet à O(1) fois pour get(Clé) de l'exploitation, et de O(log n) pour l'ajout, la suppression, et getMin opérations.
À l'aide de java 8 (statique et importations). Nous pouvons faire @superfav solution beaucoup plus propre:
Dans Java 8, nous pouvons obtenir facilement:
.get()
. Ceux-ci créent une Option.get()' sans 'isPresent()' avertissement. Découvrez cette page pour certaines solutions de rechange plus sécuritaires