Перейти к содержимому

Как в hashmap вывести элементы по значению

  • автор:

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

Вы можете указать свои ёмкость и коэффициент загрузки, используя конструкторы 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.

Как в hashmap вывести элементы по значению

Интерфейс Map представляет отображение или иначе говоря словарь, где каждый элемент представляет пару «ключ-значение». При этом все ключи уникальные в рамках объекта Map. Такие коллекции облегчают поиск элемента, если нам известен ключ — уникальный идентификатор объекта.

Следует отметить, что в отличие от других интерфейсов, которые представляют коллекции, интерфейс Map НЕ расширяет интерфейс Collection.

Среди методов интерфейса Map можно выделить следующие:

  • void clear() : очищает коллекцию
  • boolean containsKey(Object k) : возвращает true, если коллекция содержит ключ k
  • boolean containsValue(Object v) : возвращает true, если коллекция содержит значение v
  • Set> entrySet() : возвращает набор элементов коллекции. Все элементы представляют объект Map.Entry
  • boolean equals(Object obj) : возвращает true, если коллекция идентична коллекции, передаваемой через параметр obj
  • boolean isEmpty : возвращает true, если коллекция пуста
  • V get(Object k) : возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значение null
  • V getOrDefault(Object k, V defaultValue) : возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значение defaultVlue
  • V put(K k, V v) : помещает в коллекцию новый объект с ключом k и значением v. Если в коллекции уже есть объект с подобным ключом, то он перезаписывается. После добавления возвращает предыдущее значение для ключа k, если он уже был в коллекции. Если же ключа еще не было в коллекции, то возвращается значение null
  • V putIfAbsent(K k, V v) : помещает в коллекцию новый объект с ключом k и значением v, если в коллекции еще нет элемента с подобным ключом.
  • Set keySet() : возвращает набор всех ключей отображения
  • Collection values() : возвращает набор всех значений отображения
  • void putAll(Map map) : добавляет в коллекцию все объекты из отображения map
  • V remove(Object k) : удаляет объект с ключом k
  • int size() : возвращает количество элементов коллекции

Чтобы положить объект в коллекцию, используется метод put , а чтобы получить по ключу — метод get . Реализация интерфейса Map также позволяет получить наборы как ключей, так и значений. А метод entrySet() возвращает набор всех элементов в виде объектов Map.Entry .

Обобщенный интерфейс Map.Entry представляет объект с ключом типа K и значением типа V и определяет следующие методы:

  • boolean equals(Object obj) : возвращает true, если объект obj, представляющий интерфейс Map.Entry , идентичен текущему
  • K getKey() : возвращает ключ объекта отображения
  • V getValue() : возвращает значение объекта отображения
  • V setValue(V v) : устанавливает для текущего объекта значение v
  • int hashCode() : возвращает хеш-код данного объекта

При переборе объектов отображения мы будем оперировать этими методами для работы с ключами и значениями объектов.

Классы отображений. HashMap

Базовым классом для всех отображений является абстрактный класс AbstractMap , который реализует большую часть методов интерфейса Map. Наиболее распространенным классом отображений является HashMap , который реализует интерфейс Map и наследуется от класса AbstractMap.

Пример использования класса:

import java.util.*; public class Program < public static void main(String[] args) < Mapstates = new HashMap(); states.put(1, "Germany"); states.put(2, "Spain"); states.put(4, "France"); states.put(3, "Italy"); // получим объект по ключу 2 String first = states.get(2); System.out.println(first); // получим весь набор ключей Set keys = states.keySet(); // получить набор всех значений Collection values = states.values(); //заменить элемент states.replace(1, "Poland"); // удаление элемента по ключу 2 states.remove(2); // перебор элементов for(Map.Entry item : states.entrySet()) < System.out.printf("Key: %d Value: %s \n", item.getKey(), item.getValue()); >Map people = new HashMap(); people.put("1240i54", new Person("Tom")); people.put("1564i55", new Person("Bill")); people.put("4540i56", new Person("Nick")); for(Map.Entry item : people.entrySet()) < System.out.printf("Key: %s Value: %s \n", item.getKey(), item.getValue().getName()); >> > class Person < private String name; public Person(String value)< name=value; >String getName() >

Чтобы добавить или заменить элемент, используется метод put, либо replace, а чтобы получить его значение по ключу — метод get. С помощью других методов интерфейса Map также производятся другие манипуляции над элементами: перебор, получение ключей, значений, удаление.

shcherbakoff / Solution.java

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

package com . javarush . test . level08 . lesson03 . task05 ;
import java . util . HashMap ;
import java . util . Map ;
/* Вывести на экран список значений
Есть коллекция HashMap, туда занесли 10 различных строк.
Вывести на экран список значений, каждый элемент с новой строки.
*/
public class Solution
public static void main ( String [] args ) throws Exception
HashMap < String , String >map = new HashMap < String , String >();
map . put ( «Sim» , «Sim» );
map . put ( «Tom» , «Tom» );
map . put ( «Arbus» , «Arbus» );
map . put ( «Baby» , «Baby» );
map . put ( «Cat» , «Cat» );
map . put ( «Dog» , «Dog» );
map . put ( «Eat» , «Eat» );
map . put ( «Food» , «Food» );
map . put ( «Gevey» , «Gevey» );
map . put ( «Hugs» , «Hugs» );
printValues ( map );
>
public static void printValues ( Map < String , String >map )
for ( Map . Entry < String , String >pair : map . entrySet ())
String value = pair . getValue ();
System . out . println ( value );
>
>
>

Итерация по элементам HashMap в Java

Ситуация, когда требуется пройтись по каждому элементу в коллекции, встречается очень часто при программировании. Например, есть HashMap, в котором хранятся пары «имя студента — его оценка». Их нужно вывести на экран или обработать каким-либо образом.

HashMap в Java представляет собой структуру данных, которая позволяет хранить пары ключ-значение. Однако, способ работы с HashMap отличается от работы с привычными коллекциями, такими как ArrayList или LinkedList. Поэтому новички часто испытывают трудности с итерацией по HashMap.

В Java есть несколько способов для итерации по HashMap:

Способ 1. Использование метода entrySet()

HashMap<String, Integer> students = new HashMap<String, Integer>(); // заполнение HashMap for (Map.Entry<String, Integer> entry : students.entrySet()) < String student = entry.getKey(); Integer grade = entry.getValue(); // обработка ключа и значения >

Этот метод возвращает набор элементов HashMap, где каждый элемент представляет собой пару ключ-значение.

Способ 2. Использование метода keySet()

HashMap<String, Integer> students = new HashMap<String, Integer>(); // заполнение HashMap for (String student : students.keySet()) < Integer grade = students.get(student); // обработка ключа и значения >

Этот метод возвращает набор всех ключей HashMap. Затем для каждого ключа можно получить соответствующее значение с помощью метода get().

Способ 3. Использование итератора

HashMap<String, Integer> students = new HashMap<String, Integer>(); // заполнение HashMap Iterator<Map.Entry<String, Integer>> iterator = students.entrySet().iterator(); while (iterator.hasNext()) < Map.Entry<String, Integer> entry = iterator.next(); String student = entry.getKey(); Integer grade = entry.getValue(); // обработка ключа и значения >

Этот метод особенно полезен если во время итерации нужно удалять элементы из HashMap.

Каждый из этих способов имеет свои особенности и может быть использован в зависимости от конкретной задачи.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *