Во многих ситуациях при работе с массивами данных было бы намного удобнее обращаться к элементу не по индексу (например, 1), а по ключу (например, «Наименование»).
К сожалению, Java, даже в версии 9, не поддерживает ассоциативные массивы. Но, существует способ реализовать подобные им структуры данных с использованием обычных средств Java SE.
Для того чтобы построить простейший ассоциативный массив достаточно воспользоваться классом HashMap установив для его экземпляра строковый тип данных ключа.
Ниже приведён пример работы с такими «массивами»:
1 2 3 4 5 |
HashMap<String, Integer> fruits = new HashMap(); fruits.put("Количество апельсинов", 5); fruits.put("Количество яблок", 10); fruits.put("Количество мандаринов", 7); System.out.println(fruits.get("Количество мандаринов")); |
Если же требуется создать ассоциативный массив более сложной структуры, можно поместить объекты HashMap друг в друга и тем самым получить «ассоциативные массивы в ассоциативном массиве», как это показано в приведённом далее примере.
1 2 3 4 5 6 7 8 9 10 11 12 |
HashMap<String, Integer> fruits = new HashMap(); fruits.put("Количество апельсинов", 5); fruits.put("Количество яблок", 10); fruits.put("Количество мандаринов", 7); HashMap<String, Integer> milkProducts = new HashMap(); milkProducts.put("Количество пачек творога", 2); milkProducts.put("Количество пакетов молока", 3); milkProducts.put("Количество банок сметаны", 17); HashMap<String, HashMap<String, Integer> > eat = new HashMap(); eat.put("Фрукты", fruits); eat.put("Молочные продукты", milkProducts); System.out.println(eat.get("Молочные продукты").get("Количество пакетов молока")); |
Таким образом можно решить проблему отсутствия непосредственной поддержки ассоциативных массивов в Java. Правда, её наличие существенно облегчило бы труд программистам.
Здравствуйте разбирался со структурами данных в Java, попал на Ваш сайт.
Пишите «К сожалению, Java, даже в версии 9, не поддерживает ассоциативные массивы.», а потом приводите пример что можно реализовать используя HashMap с ключом строкового типа. Возникает два вопроса:
1. значит все-таки поддерживает?
2. ключ обязан быть строкового типа?
Отвечу на Ваши вопросы по порядку.
Вопрос №1.
Ассоциативных массивов в Java действительно нет. Поэтому написать что-то наподобие такого (обратите внимание на синтаксис):
value = myArray["myKey"];
здесь не получится.
В то же время подобные структуры данных во многих случаях довольно удобны. Поэтому приходится искать обходные пути. К счастью, требуемый функционал легко реализовать на основе HashMap и в результате получается почти полная аналогия того, что я привёл только что.
Вопрос №2
Согласно документации ключом фактически может быть любой тип данных.