Доступ к глубоко вложенным 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 для вставки значения.

Другие вопросы по тегам