Как поместить/получить значения в/из Nested HashMap

Я хочу создать вложенный HashMap, который возьмет два ключа типа float и выдаст значение типа Integer.

 public static HashMap> hashX = new HashMap>();

Есть ли простой способ ввода/получения значений, подобных обычным HashMap i.e.

  hashX.put(key, value);
  hashX.get(key);

или это более сложный метод, который необходимо использовать? Я искал в Интернете решение, но мне трудно найти решение, которое применимо ко мне. Любая помощь будет оценена!

7
Вы должны использовать интерфейс Map , как этот Map > в объявлении вашего типа.
добавлено автор Adam Arold, источник

5 ответы

Map> map = new HashMap<>();

map.put(.0F, new HashMap(){{put(.0F,0);}});
map.put(.1F, new HashMap(){{put(.1F,1);}});

map.get(.0F).get(.0F);
9
добавлено
И появляется пресловутый блок инициализатора экземпляра. :)
добавлено автор Adam Arold, источник
Это NullPointerException , потому что map.get (0) вернет null
добавлено автор jlordo, источник
@jlordo, ты прав, я исправил это.
добавлено автор isvforall, источник
@ user1927105 К сожалению, только HashMap > ();
добавлено автор isvforall, источник
@isvforall спасибо, все равно вокруг использования HashMap <> (), я использую Android, и я не могу использовать уровень 1.7, поскольку Android требует 5.0
добавлено автор user1927105, источник

Вы должны get() вставить карту из внешней карты, и вызов может вызвать put() и get() на нем

float x = 1.0F;
HashMap innerMap = hashX.get(x);
if (innerMap == null) {
    hashX.put(x, innerMap = new HashMap<>());//Java version >= 1.7
}
innerMap.put(2.0F, 5);
3
добавлено
Обратите внимание, что это будет работать только с 1.7 или более поздней.
добавлено автор Adam Arold, источник
@ downvoter: не забудьте оставить комментарий?
добавлено автор jlordo, источник

Вы можете создать класс-оболочку следующим способом:

public class MyWrapper {
    private Map> hashX;
   //...
    public void doublePut(Float one, Float two, Integer value) {
        if (hashX.get(one) == null) {
            hashX.put(one, new HashMap());
        }
      hashX.get(one).put(two, value);
    }
}

Обратите внимание, что при объявлении полей вы должны использовать интерфейсы вместо конкретных реализаций. Например, при необходимости возникнет необходимость в реорганизации HashMap в ConcurrentHashMap .

1
добавлено
Ну, это выглядело несколько более идиоматичным способом.
добавлено автор Adam Arold, источник
Почему бы вам не сохранить ссылку на новую карту, чтобы избежать следующей операции поиска, как вы видели в моем ответе?
добавлено автор jlordo, источник

Я хочу создать вложенный HashMap, который возьмет два ключа типа float и выдаст значение типа Integer.

Вы не нуждаетесь вложенную карту для этого. Если вы хотите искать с помощью сложного ключа, лучше объявить свою карту как таковую. В JFK нет хорошего класса Pair , но вы можете использовать Map.Entry , что несколько неудобно использовать, но работает:

Map, Integer> map = new ....

См. https://stackoverflow.com/a/3110563/18573 для создания Map.Entry экземпляры

0
добавлено

Вы можете сделать это следующим образом:

HashMap h1 = new HashMap();
h1.put(1.0f,new Integer(1));
HashMap h2 = new HashMap();
h2.put(3.0f,new Integer(3));

hashX.put(1.0f, h1);
hashX.put(1.0f, h1);
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async