Est-il" agréable " en java d'utiliser map qui a des cartes comme valeurs?


Par exemple, est-il généralement bon d'avoir une structure comme:

Map <Object, Map>

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

Author: weston, 2016-04-21

3 answers

, Il a quelques odeurs de code pour moi.

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

Donc je préférerais voir:

Map<CompositeKey, ValueType>

CompositeKey est une classe avec une implémentation d'égalité correcte composée de la première et deuxième touches. et ValueType n'est pas Map.

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

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

Vous avez une carte plate et une clé composite:

(A,1) -> "ABC",
(A,2) -> "DEF",
(B,1) -> "abc",
(B,3) -> "def",
 2
Author: weston, 2016-04-21 13:31:09

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

Si vous allez faire une recherche sur l'objet map, j'envisagerais d'utiliser un HashMap pour améliorer le temps d'exécution.

De @Rafael Osipov, Dans les cas impliquant la concurrence, envisagez d'utiliser ConcurrentHashMap, pour l'intégrité des données.

 2
Author: Blake Yarbrough, 2016-05-09 21:05:07

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 à l'aide de plusieurs clés.

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

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

Vous pourriez les stocker dans un List<Student> mais si vous voulez trouver, disons, tous les élèves d'une certaine école qui ont 16 ans, il serait peut-ê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, telles que d'avoir un type de clé composite (dans mon exemple ci-dessus, représentant l'école et l'âge ensemble). Gardez également à l'esprit que si votre objectif principal dans l'utilisation d'une carte est l'efficacité, dans de nombreux cas, vous optimisez probablement prématurément. À moins que la carte stocke plusieurs millions de valeurs ou que vous y accédiez plusieurs milliers de fois par seconde, vous voudrez peut-être envisager une liste simple que vous recherchez.

 0
Author: sprinter, 2016-04-21 13:25:06