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