2008-11-05 7 views
8

Existe-t-il une raison de trier MultiMap en Java et comment le faire?Comment trier un MultiMap <k,v> en java?

+1

Je propose que cette question soit rouverte – mdec

+0

Je propose également qu'il soit reopend. –

+0

Ce qui n'est pas réel à propos de "Comment trier un MultiMap dans java?"? Je reste avec mdec et Steve. +1 pour la réouverture! – Burkhard

Répondre

1

En supposant que vous parlez de org.apache.commons.collections.MultiMap, alors vous ne pouvez pas; puisqu'il renvoie un Collection et non un List, il ne supporte pas le concept d'ordre.

Si vous parlez org.apache.commons.collections.MultiHashMap, tout ce que vous devez faire est de parcourir les touches, de prendre le ArrayList retourné et de le trier en utilisant Collections.sort(). Cela suppose que vous utilisez that implementation though.

Rien ne vous empêche cependant d'implémenter votre propre MultiMap assez facilement, qui prend en charge les listes de tri. Il peut être aussi facile que HashMap<K, Collection<V>>, je ne suis pas familier avec le fonctionnement de MultiMaps.

1

En fait, je ne sais pas pourquoi vous voudriez trier une carte. Une carte est un dictionnaire et vous récupérez à partir de ce dictionnaire un (ou dans le cas des multimaps une collection de) valeur (s) qui vous intéresse.

Dans le cas d'un MultiMap vous voudrez peut-être trier le Collection résultant d'un get. Mais quel avantage avez-vous d'une carte triée puisqu'elle n'accélère rien pour trouver une valeur spécifique?

+0

Si vous considérez une carte comme une collection de tuples, ce problème a du sens. Les cartes en Java permettent d'attribuer un index à chaque occurrence d'une collection. Pensez à Maps en tant que tables avec un PK non-syntaxique, par exemple. 1-> orange, 2-> banane Le problème est lorsque vous commencez à utiliser des cartes comme ** collections de tuples **. George-> Constanza, Jerry-> Seinfeld. Ensuite, vous devrez peut-être trier la carte, par exemple, Prénom ou nom (clé ou valeur) Si Java fourni tuples 'alla' Python, ce ne serait pas un problème – llappall

+0

Je ne comprends pas le commentaire. Soit on itère sur la carte complète, soit on récupèrerait une valeur avec une clé. Dans les deux cas, aucun tri n'est nécessaire. Je pense que votre exemple en tant que collection de tuples est valide, mais je n'utiliserais pas de Multimap pour cela. De plus, j'utiliserais une autre structure de données pour votre exemple de tuple. – boutta

0

La solution la plus simple consiste à utiliser TreeMultimap de la goyave. Utilisez directement

TreeMultimap<...> sortedMap = TreeMultimap.create(notSortedMultiMap); 

si vos clés et valeurs sont triables naturellement (mettre en œuvre Comparable), ou

TreeMultimap<...> sortedMap = TreeMultimap.create(keyComparator, valueComparator); 
sortedMap.putAll(notSortedMultiMap); 

si vous devez fournir des comparateurs personnalisés.

Si vous savez que vous en aurez besoin et que vous vous souciez peu de la vitesse de récupération, vous pouvez bien sûr utiliser TreeMap dès le début.

Ensuite, vous pouvez itérer sur TreeMap ou utiliser quelque chose comme valeurs() ou des entrées pour obtenir la collection triée.