4 votes

Y a-t-il une structure de données commune qui représente une carte de listes en Java

Je recherche une structure de données commune qui possède les capacités d'un Map>

Actuellement, ce que je fais ressemble à quelque chose comme

public class MapOfLists {

     private Map> map = new HashMap>();

     public void addItem(K key, V value){
        if(!map.containsKey(key)){
            map.put(key, new ArrayList());
        }
        List list = map.get(key);
        list.add(value);
     }
     ...
}

N'y a-t-il pas une solution plus générique? Est-ce que je réinvente la roue (ou un artefact moins important)

7voto

duffymo Points 188155

Comme un Google MultiMap....ou Apache Commons DefaultMapBag.

Personnellement, je ne vois rien de mal avec votre approche. Vous échangez le temps qu'il a fallu pour écrire (pas si long) et maintenir contre le fait d'avoir une autre dépendance à une bibliothèque tierce comme Google. Votre approche est défendable.

2voto

Ravi Wallau Points 5012

Je choisirais Google Multimap. Je n'utiliserais pas la bibliothèque Apache Commons Collections car elle ne prend pas en charge les generics, et la bibliothèque Google Collection est assez décente, donc je l'utilise à la place des Apache Commons Collections depuis un certain temps maintenant. Ce qu'il y a de bien avec toutes les classes de la classe Google Collections, et même dans Apache Commons Lang, c'est que si vous regardez la plupart de ses méthodes, elles seront généralement petites, et cela vous fera gagner une ou deux lignes de code à chaque fois.

Mais à la longue, lorsque vous n'avez pas beaucoup de blocs conditionnels dans votre code pour vérifier si un objet est null avant de le comparer ou si une liste existe dans une carte pour prendre une décision (puis ajouter un élément ou créer la liste et la mettre dans la carte), votre code finira par être plus lisible et avec moins de bruit autour.

[2]: [http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/ObjectUtils.html#equals(java.lang.Object](http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/ObjectUtils.html#equals(java.lang.Object), java.lang.Object)

2voto

Pete Kirkham Points 32484

Je tends à utiliser une carte vers une liste chaînée simple immuable, l'appelant généralement Cons pour des raisons historiques, où la liste se termine par un null. Dans ce cas, le code ci-dessus se réduit à :

public void addItem(K key, V value) {
    map.put ( key, new Cons ( value, map.get ( key ) ) );
}

puisque la création d'un cons avec null comme sa queue est valide.

1voto

Reverend Gonzo Points 15504

Il n'y a rien dans le Java de base qui ferait ce que vous essayez de faire.

Il peut y en avoir dans des bibliothèques tierces, mais j'ai toujours écrit ma propre classe car c'est relativement simple.

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