2016-04-21 1 views
1

Par exemple, est-il généralement bon d'avoir une structure comme:Est-il "agréable" en Java d'utiliser une carte qui a des cartes en tant que valeurs?

Map <Object, Map> 

Dans mon cas, à première vue, je ne besoin d'une sorte de structure qui aurait par exemple la cartographie String -> Map<...>, ou c'est bizarre et je devrais résoudre le problème d'une manière ou d'une autre?

+1

dépend de votre cas d'utilisation. Il n'y a rien de mal à cela. – khelwood

+0

Il n'est pas agréable d'utiliser [types bruts] (https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html) n'importe où. À tout le moins, faites-le 'Map >'. –

+0

Je ne pose pas de questions sur le type de ligne, mais sur le fait d'avoir une carte ayant une valeur. Cas d'utilisation: j'ai un commutateur, par exemple JComboBox, et j'ai besoin d'une carte séparée à associer à chaque objet de la liste, donc si j'en sélectionne un, la carte correspondante sera utilisée. –

Répondre

2

Il n'est pas intrinsèquement bon de concevoir votre structure de données de cette façon. Ce n'est pas nécessairement mauvais.

Si vous effectuez une recherche sur l'objet de la carte, j'utiliserais un HashMap pour améliorer le temps d'exécution. De @Rafael Osipov, Dans les cas impliquant la concurrence, pensez à utiliser ConcurrentHashMap, pour l'intégrité des données.

+0

Que devrait être cet indice 'HashMap'? C'est totalement sans rapport et potentiellement "mauvais" ... – Marco13

+0

en fait HashMap est implémentation standart d'une carte. Dans le projet dans la praxis vous voyez à peine autre chose. Oui, la question n'était pas à ce sujet –

+0

Dans le cas où l'implémentation implique la concurrence, considérer 'ConcurrentHashMap' sur' HashMap' pour le gain de performance. –

0

Il n'y a rien de mal à avoir une carte comme valeur dans une carte. C'est une façon assez courante d'implémenter une recherche rapide en utilisant plusieurs clés.

Par exemple, vous stockez un grand nombre de Student records:

class Student 
    private String name; 
    private int age; 
    private School school; 
} 

Vous pouvez stocker dans un List<Student> mais si vous voulez trouver, par exemple, tous les élèves à une certaine école qui sont 16 ans vieux, il pourrait être préférable de pouvoir dire:

Map<School,Map<Integer,List<Student>>> index; 
List<Student> subset = index.get(School.STATE_HIGH).get(16); 

Notez qu'il existe d'autres façons de faire la même chose comme avoir un composite séparé type de clé (dans mon exemple ci-dessus, ce qui représente l'âge scolaire et ensemble). Gardez aussi à l'esprit que si votre objectif principal est d'utiliser une carte, c'est que, dans de nombreux cas, vous optimisez probablement prématurément. À moins que la carte ne stocke des millions de valeurs ou que vous y accédiez plusieurs milliers de fois par seconde, vous pouvez envisager une liste simple que vous recherchez.

2

Il a quelques odeurs de code pour moi.

  1. Le Map intérieur ne précise pas les types génériques.
  2. Il est dit que vous devez faire deux recherches. Je préférerais une clé composée et une seule recherche sur une carte aplatie.
  3. Ajouter à cette structure doit être trop compliqué. La clé est object, pas fortement typée.

Je préférerais voir:

Map<CompositeKey, ValueType> 

CompositeKey est une classe avec la mise en œuvre de l'égalité correcte composée des première et deuxième clés. et ValueType n'est pas un Map.

Ainsi, par exemple, au lieu de cartes imbriquées:

A -> { 1 -> "ABC", 
     2 -> "DEF"}, 
B -> { 1 -> "abc", 
     3 -> "def"} 

Vous avez une carte plat et d'une clé composite:

(A,1) -> "ABC", 
(A,2) -> "DEF", 
(B,1) -> "abc", 
(B,3) -> "def",