Как пройтись по hashmap java
Здравствуйте, Аноним, Вы писали:
А>есть HashMap как получить в цикле ключ\значение?
Тебе нужен проход по коллекции, возвращаемой HashMap.entrySet().
А>они будут в том же порядке что и заносились?
Не будут. Для того, чтобы получить такую функциональность, можешь использовать LinkedHashMap
Re: HashMap как пройти в цикле
| От: | ScarryDen | |
| Дата: | 30.10.07 09:15 | |
| Оценка: | -1 | |
Здравствуйте, Аноним, Вы писали:
А>есть HashMap как получить в цикле ключ\значение?
А>они будут в том же порядке что и заносились?
for(Object key : map.keySet)
Object value = map.get(key);
Re[2]: HashMap как пройти в цикле
| От: | Blazkowicz | |
| Дата: | 30.10.07 10:04 | |
| Оценка: | +1 | |
Здравствуйте, ScarryDen, Вы писали:
SD>for(Object key : map.keySet)
SD> Object value = map.get(key);
Этот способ хуже итерирования по entrySet, потому что в каждой итерации происходит поиск по ключу.
Re[3]: HashMap как пройти в цикле
| От: | C0s |
| Дата: | 30.10.07 10:15 |
| Оценка: |
Здравствуйте, Blazkowicz, Вы писали:
SD>>for(Object key : map.keySet)
SD>> Object value = map.get(key);
B>Этот способ хуже итерирования по entrySet, потому что в каждой итерации происходит поиск по ключу.
он хуже не только увеличением сложности алгоритма, но и дополнительными временными объктами, создание которых не является необходимым (речь о keySet)
Re[4]: HashMap как пройти в цикле
| От: | Blazkowicz |
| Дата: | 30.10.07 10:19 |
| Оценка: |
Здравствуйте, C0s, Вы писали:
C0s>он хуже не только увеличением сложности алгоритма, но и дополнительными временными объктами, создание которых не является необходимым (речь о keySet)
Разве keySet это временный объект? Он же вроде единственный и завязан на саму мапу (для тех кто наследуется от AbstractMap).
Re[5]: HashMap как пройти в цикле
| От: | C0s |
| Дата: | 30.10.07 10:31 |
| Оценка: |
Здравствуйте, Blazkowicz, Вы писали:
B>Разве keySet это временный объект? Он же вроде единственный и завязан на саму мапу (для тех кто наследуется от AbstractMap).
я, скорее, должен был написать «ненужный»
угу, он не временный, но эта логика прописана в каждом потомке явно.
ps. в принципе, я согласен, что объект достаточно лекговесный. но из этого не следует, что его нужно использовать
HashMap
При работе с массивами я сравнивал их с коробочками. Слово HashMap содержит слово map — карта. Только это не пытайтесь найти сходство с картами в географическом атласе, с гуглокартами, с Яндекс.Картами или, на худой конец, с игральными картами. Это карточка в картотеке. Вы заполняете карточки какими-то данными и кладёте их в ящик. Если вы содержите гостиницу для котов, то скорее всего вы занесёте в карточку имя кота, возраст и т.п.
Класс HashMap использует хеш-таблицу для хранения карточки, обеспечивая быстрое время выполнения запросов get() и put() при больших наборах. Класс реализует интерфейс Map (хранение данных в виде пар ключ/значение). Ключи и значения могут быть любых типов, в том числе и null. При этом все ключи обязательно должны быть уникальны, а значения могут повторяться. Данная реализация не гарантирует порядка элементов.
Общий вид HashMap:
// K - это Key (ключ), V - Value (значение) class HashMap
Объявить можно следующим образом:
Map hashMap = new HashMap(); // или так Map hashMap = new HashMap();
По умолчанию при использовании пустого конструктора создается картотека ёмкостью из 16 ячеек. При необходимости ёмкость увеличивается, вам не надо об этом задумываться.

Вы можете указать свои ёмкость и коэффициент загрузки, используя конструкторы HashMap(capacity) и HashMap(capacity, loadFactor). Максимальная ёмкость, которую вы сможете установить, равна половине максимального значения int (1073741824).
Добавление элементов происходит при помощи метода put(K key, V value). Вам надо указать ключ и его значение.
hashMap.put("0", "Васька");
hashMap.size();
Проверяем ключ и значение на наличие:
hashMap.containsKey("0"); hashMap.containsValue("Васька");
Выбираем все ключи:
for (String key : hashMap.keySet())
Выбираем все значения:
for (int value : hashMap.values())
Выбираем все ключи и значения одновременно:
for (Map.Entry entry : hashMap.entrySet())
Пример первый
// Создадим хеш-карточку Map hashMap = new HashMap<>(); // Помещаем данные на карточку hashMap.put("Васька", 5); hashMap.put("Мурзик", 8); hashMap.put("Рыжик", 12); hashMap.put("Барсик", 5); // Получаем набор элементов Set set = hashMap.entrySet(); // Отобразим набор for (Map.Entry me : set) < System.out.print(me.getKey() + ": "); System.out.println(me.getValue()); >// Добавляем значение int value = hashMap.get("Рыжик"); hashMap.put("Рыжик", value + 3); System.out.println("У Рыжика стало " + hashMap.get("Рыжик"));
Если вы посмотрите на результат, то увидите, что данные находятся не в том порядке, в котором вы заносили. Второй важный момент — если в карточке уже существует какой-то ключ, то если вы помещаете в него новое значение, то ключ перезаписывается, а не заносится новый ключ.
В древних версиях Java приходилось добавлять новые значения следующим образом.
hashMap.put("Мурзик", new Integer(8)); // или hashMap.put("Мурзик", Integer.valueOf(8));
Потом Java поумнела и стала самостоятельно переводить число типа int в объект Integer. Но это не решило основной проблемы — использование объектов очень сильно сказывается на потреблении памяти. Поэтому в Android были предложены аналоги этого класса (см. ниже). Ключом в Map может быть любой объект, у которого корректно реализованы методы hashCode() и equals().
Пример второй
Так как ключи являются уникальными, мы можем написать следующую программу — сгенерируем набор случайных чисел сто раз и посчитаем количество повторов. Map легко решит эту задачу — в качестве ключа используется сгенерированное число, а в качестве значения — количество повторов.
Random random = new Random(36); Map hashMap = new HashMap<>(); for (int i = 0; i < 100; i++)< // Создадим число от 0 до 10 int number = random.nextInt(10); Integer frequency = hashMap.get(number); hashMap.put(number, frequency == null ? 1 : frequency + 1); >System.out.println(hashMap);
Метод get() возвращает null, если ключ отсутствует, т.е число было сгенерировано впервые или в противном случае метод возвращает для данного ключа ассоциированное значение, которое увеличивается на единицу.
Пример третий
Пример для закрепления материала. Поработаем с объектами классов. Нужно самостоятельно создать класс Pet и его наследников Cat, Dog, Parrot.
Создадим отображение из домашних животных, где в качестве ключа выступает строка, а в качестве значения класс Pet.
Map hashMap = new HashMap<>(); hashMap.put("Кот", new Cat("Мурзик")); hashMap.put("Собака", new Dog("Бобик")); hashMap.put("Попугай", new Parrot("Кеша")); System.out.println(hashMap); Pet cat = hashMap.get("Кот"); System.out.println(cat); System.out.println(hashMap.containsKey("Кот")); System.out.println(hashMap.containsValue(cat));
Многомерные отображения
Контейнеры Map могут расширяться до нескольких измерений, достаточно создать контейнер Map, значениями которого являются контейнеры Map (значениями которых могут быть другие контейнеры). Предположим, вы хотите хранить информацию о владельцах домашних животных, у каждого из которых может быть несколько любимцев. Для этого нам нужно создать контейнер Map>.
Map> personMap = new HashMap<>(); personMap.put(new Person("Иван"), Arrays.asList(new Cat("Барсик"), new Cat("Мурзик"))); personMap.put(new Person("Маша"), Arrays.asList(new Cat("Васька"), new Dog("Бобик"))); personMap.put(new Person("Ирина"), Arrays.asList(new Cat("Рыжик"), new Dog("Шарик"), new Parrot("Гоша"))); System.out.println("personMap: " + personMap); System.out.println("personMap.keySet(): " + personMap.keySet()); for(Person person : personMap.keySet()) < System.out.println(person + " имеет"); for (Pet pet : personMap.get(person))< System.out.println(" " + pet); >>
Метод keySet() возвращает контейнер Set, содержащий все ключи из personMap, который используется в цикле для перебора элементов Map.
Sparse arrays — аналог в Android
Разработчик Android посчитали, что HashMap не слишком оптимизирован для мобильных устройств и предложили свой вариант в виде специальных массивов. Данные классы являются родными для Android, но не являются частью Java. Очень рекомендуют использовать именно Android-классы. Не все программисты знают об этих аналогах, а также классический код может встретиться в различных Java-библиотеках. Если вы увидите такой код, то заменить его на нужный. Ниже представлена таблица для замены.
| HashMap | Array class |
|---|---|
| HashMap | ArrayMap |
| HashMap | SparseArray |
| HashMap | SparseBooleanArray |
| HashMap | SparseIntArray |
| HashMap | SparseLongArray |
| HashMap | LongSparseArray |
Существует ещё класс HashTable, который очень похож в использовании как и HashMap.
Как с помощью fori пройтись по HashMap?
Как-то так. Но здесь создается лишний List, поэтому если вам просто нужен индекс, то добавьте соот. переменную и инкрементируйте ее в цикле.
List keys = new ArrayList(map.keySet()); for(int i = 0; i
Отслеживать
ответ дан 22 фев 2016 в 14:26
4,079 1 1 золотой знак 9 9 серебряных знаков 22 22 бронзовых знака
int i = 0; for (Map.Entry entry : map.entrySet()) < System.out.println(i + " " + entry.getKey() + " " + entry.getValue()); ++i; //iterate >
Iterator> iterator = map.entrySet().iterator(); for (int i = 0; ; ++i) < if(iterator.hasNext()) < Map.Entryentry = iterator.next(); System.out.println(i + " " + entry.getKey() + " " + entry.getValue()); > else break; >
Отслеживать
ответ дан 8 мар 2016 в 1:17
191 6 6 бронзовых знаков
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Перебор элементов коллекции Map
В библиотеке Java предусмотрены две основные реализации словарей (карт): хэш-карта HashMap и карта-дерево ТгееМар. Оба эти класса реализуют интерфейс Map, который не наследует интерфейс Collection, но является неотъемлемой частью коллекций. Все интерфейсы фреймворка находятся в пакете java.util.
В хэш-карте ключи расположены случайным образом, а в карте-дереве — в строгом порядке. Хэш-функция, или функция сравнения, применяется только для ключей, а сами значения, соответствующие этим ключам, не хэшируются и не сравниваются.
Проход по каждой паре ключ-значение — самая базовая, основная процедура прохода по Map. В Java, каждая пара хранится в поле Map называемом Map.Entry. Map.entrySet() возвращает набор ключей-значений, потому самым эффективным способом пройтись по всем значениям Map будет:
for (Map.Entry entry: hashmap.entrySet()) System.out.println(entry.getKey() + " = " + entry.getValue());
Так же мы можем использовать Iterator — интерфейс, для организации цикла для перебора коллекций.
// hasNext() проверяет есть ли ещё элементы // next() возвращает очередной элемент Iterator> itr = hashmap.entrySet().iterator(); while (itr.hasNext()) System.out.println(itr.next());
Можно пробежаться по ключам:
// keySet возвращает множество ключей for (String key: map.keySet()) System.out.println(map.get(key));