Доступ к глубоко вложенным HashMaps в Java
Итак, у меня есть этот HashMap:
HashMap<String,HashMap<Float,HashMap<Float,String>>>
Но я не уверен, как добавлять и удалять элементы из самой глубоко вложенной структуры. Может кто-нибудь привести пример?
Спасибо:)
Обновить:
Спасибо за помощь, но как я могу просто поставить на первый уровень HashMap? Я пробовал.put и получаю ошибку.
Спасибо
5 ответов
Сначала создайте карту:
HashMap<String, HashMap<Float,HashMap<Float, String>>> map = new HashMap<>();
Затем поместите в нее карту первого уровня:
map.put("one", new HashMap<Float, HashMap<Float, String>>());
Затем поместите HashMap на последний уровень:
map.get("one").put(1.0f,new HashMap<Float, String>());
Теперь поместите элемент в новую карту:
map.get("one").get(1.0f).put(2.0f,"this is lame");
и теперь это может быть получено как описано выше:
System.out.println(map.get("one").get(1.0f).get(2.0f));
Если вы планируете создавать однородные HashMaps с переменной глубиной, используйте рекурсивную структуру данных.
Ниже приведена реализация, обеспечивающая пример интерфейса:
class NestedMap<K, V> {
private final HashMap<K, NestedMap> child;
private V value;
public NestedMap() {
child = new HashMap<>();
value = null;
}
public boolean hasChild(K k) {
return this.child.containsKey(k);
}
public NestedMap<K, V> getChild(K k) {
return this.child.get(k);
}
public void makeChild(K k) {
this.child.put(k, new NestedMap());
}
public V getValue() {
return value;
}
public void setValue(V v) {
value = v;
}
}
и пример использования:
class NestedMapIllustration {
public static void main(String[] args) {
NestedMap<Character, String> m = new NestedMap<>();
m.makeChild('f');
m.getChild('f').makeChild('o');
m.getChild('f').getChild('o').makeChild('o');
m.getChild('f').getChild('o').getChild('o').setValue("bar");
System.out.println(
"nested element at 'f' -> 'o' -> 'o' is " +
m.getChild('f').getChild('o').getChild('o').getValue());
}
}
Имеющий HashMap<String,HashMap<Float,HashMap<Float,String>>> map
и без учета null
значения, просто следуйте логической последовательности, которую вы сформулируете в своем уме, чтобы получить доступ к внутренней карте и перевести на следующий код:
map.get(strKey).get(floatKey).put(newFloat, newString);
map.get(strKey).get(floatKey).remove(newFloat);
strKey
это ключ String
на карте первого уровня
floatKey
ключ Float
на карте второго уровня
Давайте посмотрим, не так ли?
Первый слой HashMap<String, HashMap>
, Итак, начнем get
,
map.get(strKey); // Returns another HashMap
У нас есть еще один HashMap
назад, так что же нам делать? Мы используем get
снова!
map.get(strKey).get(1.0f); // Returns another HashMap
Опять же, что мы делаем? Ну, только одна вещь для этого. get
!
map.get(strKey).get(1.0f).get(1.0f); // Returns a String
Это значение в глубоко вложенных HashMap
,
Итак, сначала вы получите первый HashMap со строкой в качестве ключа. Это вернет вам HashMap<Float,HashMap<Float,String>>
,
Затем вы получите HashMap с ключом Float. Это вернет HashMap<Float,String>
,
Наконец, вы получите HashMap с ключом Float, и у вас есть строка, которую вы хотите. То же самое с путом вместо последнего в HashMap для вставки значения.