Si vous avez besoin d'une carte avec plusieurs clés, vous pouvez utiliser une bibliothèque tierce, ou vous pouvez imbriquer la bibliothèque standard Map
.
Ici, un exemple est une carte avec trois touches.
Le premier est «get ()». Renvoie «null» si aucune valeur avec la clé spécifiée n'existe.
public static <A, B, C, D> D get(Map<A, Map<B, Map<C, D>>> map, A a, B b, C c) {
return Optional.ofNullable(map.get(a))
.map(m -> m.get(b))
.map(m -> m.get(c))
.orElse(null);
}
Vient ensuite put ()
.
public static <A, B, C, D> void put(Map<A, Map<B, Map<C, D>>> map, A a, B b, C c, D d) {
map.computeIfAbsent(a, t -> new HashMap<>())
.computeIfAbsent(b, t -> new HashMap<>())
.put(c, d);
}
Si vous connaissez le modèle, vous pouvez facilement créer une carte avec 4 touches ou plus. Voici le code de test.
@Test
public void testMultiKeyMap() {
Map<Integer, Map<Integer, Map<Integer, Integer>>> map = new HashMap<>();
for (int a = 0, value = 0; a < 2; ++a)
for (int b = 0; b < 2; ++b)
for (int c = 0; c < 2; ++c)
put(map, a, b, c, value++);
Map<Integer, Map<Integer, Map<Integer, Integer>>> expected =
Map.of(0, Map.of(0, Map.of(0, 0,
1, 1),
1, Map.of(0, 2,
1, 3)),
1, Map.of(0, Map.of(0, 4,
1, 5),
1, Map.of(0, 6,
1, 7)));
assertEquals(expected, map);
for (int a = 0, value = 0; a < 2; ++a)
for (int b = 0; b < 2; ++b)
for (int c = 0; c < 2; ++c)
assertEquals(value++, get(map, a, b, c));
assertEquals(null, get(map, 2, 2, 2));
}
map.toString ()
ressemble à ceci:
{0={0={0=0, 1=1}, 1={0=2, 1=3}}, 1={0={0=4, 1=5}, 1={0=6, 1=7}}}
Recommended Posts