Java iterator string map

8 Best ways to Iterate through HashMap in Java

As a Java developer, everyone should know how to Iterate through HashMap, as it will be part of his routine programming. Unlike other Collections, we cannot iterate through HashMap directly we need to get the keySet or entrySet to iterate.

In this article, we will learn about all the different ways of iterating a HashMap in Java.

8 Best ways to Iterate through HashMap in Java

Method 1. Iterate through a HashMap EntrySet using Iterator

Map interface didn’t extend a Collection interface and hence it will not have its own iterator. entrySet() returns a Set and a Set interface which extends the Collection interface and now on top of it, we can use the Iterator.

Now we can get the key-value pair easily using the getKey() and getValue() method.

package com.javainterviewpoint.iterate; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class IterateHashMap1 < public static void main(String[] args) < HashMaphm = new HashMap<>(); hm.put("Cricket", "Sachin"); hm.put("Football", "Zidane"); hm.put("Tennis", "Federer"); Iterator> entrySet = hm.entrySet().iterator(); while (entrySet.hasNext()) < Map.Entryentry = entrySet.next(); System.out.println("Key : "+entry.getKey()+" Value : "+entry.getValue()); > > >

Method 2. Iterate through HashMap KeySet using Iterator

The keySet() method returns the Set of all the Keys in the HashMap. Since it is a Set again we can use the Iterator to iterate it.

package com.javainterviewpoint.iterate; import java.util.HashMap; import java.util.Iterator; public class IterateHashMap2 < public static void main(String[] args) < HashMaphm = new HashMap<>(); hm.put("Cricket", "Sachin"); hm.put("Football", "Zidane"); hm.put("Tennis", "Federer"); Iterator keySetIterator = hm.keySet().iterator(); while (keySetIterator.hasNext()) < String key = keySetIterator.next(); System.out.println("Key : "+key+" Value : "+hm.get(key)); >> >

Method 3. Iterate HashMap using For-each Loop

The For-Each loop is available for all the classes which implement the Iterable interface. entrySet() method returns Set interface, Set interface extends the Collection interface which in turn extends the Iterable Interface.

Читайте также:  Javascript to use cookies to

The for-each loop (or) enhanced for loop in Java will invoke the iterator() method internally.

package com.javainterviewpoint.iterate; import java.util.HashMap; import java.util.Map; import java.util.Set; public class IterateHashMap3 < public static void main(String[] args) < HashMaphm = new HashMap<>(); hm.put("Cricket", "Sachin"); hm.put("Football", "Zidane"); hm.put("Tennis", "Federer"); Set> entrySet = hm.entrySet(); for(Map.Entry entry : entrySet) < System.out.println("Key : "+entry.getKey()+" Value : "+entry.getValue()); >> >

Method 4. Iterate a HashMap using For-each Loop Java iterator string map

package com.javainterviewpoint.iterate; import java.util.HashMap; import java.util.Set; public class IterateHashMap4 < public static void main(String[] args) < HashMaphm = new HashMap<>(); hm.put("Cricket", "Sachin"); hm.put("Football", "Zidane"); hm.put("Tennis", "Federer"); Set keySet = hm.keySet(); for(String key : keySet) < System.out.println("Key : "+key+" Value : "+hm.get(key)); >> >

Method 5. Iterating through a HashMap using Lambda Expressions

The forEach() method of the HashMap takes up the BiConsumer functional interface as the argument and hence we can pass it a lambda expression that takes two inputs as argument key and value

package com.javainterviewpoint.iterate; import java.util.HashMap; public class IterateHashMap5 < public static void main(String[] args) < HashMaphm = new HashMap<>(); hm.put("Cricket", "Sachin"); hm.put("Football", "Zidane"); hm.put("Tennis", "Federer"); hm.forEach((k,v) -> ); > >

We can also use map.entrySet().forEach() which belongs to the Iterable interface, it takes up Consumer Functional Interface as the argument.

package com.javainterviewpoint.iterate; import java.util.HashMap; public class IterateHashMap6 < public static void main(String[] args) < HashMaphm = new HashMap<>(); hm.put("Cricket", "Sachin"); hm.put("Football", "Zidane"); hm.put("Tennis", "Federer"); hm.entrySet().forEach((entry) -> ); > >

Method 6. Loop through a HashMap using Stream API

The Stream represents a sequence of elements from a source, the source can be a Collection or array which can provide data to a Stream.

In the below code we will get EntrySet from the entrySet() method, from the entrySet we will get the Stream through the stream() method which we will be iterating using forEach(). The entry reference will be further passed to a lambda

package com.javainterviewpoint.iterate; import java.util.HashMap; public class IterateHashMap7 < public static void main(String[] args) < HashMaphm = new HashMap<>(); hm.put("Cricket", "Sachin"); hm.put("Football", "Zidane"); hm.put("Tennis", "Federer"); hm.entrySet().stream().forEach (entry-> System.out.println("Key : "+entry.getKey()+" Value : "+entry.getValue())); > >

Method 7. Using Stream of() method

We will be converting a HashMap into a Stream using the Stream.of() method, on top which we can use the forEach() method to iterate.

package com.javainterviewpoint.iterate; import java.util.HashMap; import java.util.stream.Stream; public class IterateHashMap8 < public static void main(String[] args) < HashMaphm = new HashMap<>(); hm.put("Cricket", "Sachin"); hm.put("Football", "Zidane"); hm.put("Tennis", "Federer"); Stream.of(hm.entrySet()) .forEach((entry) ->); > >

Method 8. Iterate a HashMap using Iterator.forEachRemaining() method

The forEachRemaining() method is newly added to Iterator interface in Java 8. As we have seen it earlier we can get the iterator of a Map through a Set [entrySet()]

package com.javainterviewpoint.iterate; import java.util.HashMap; public class IterateHashMap9 < public static void main(String[] args) < HashMaphm = new HashMap<>(); hm.put("Cricket", "Sachin"); hm.put("Football", "Zidane"); hm.put("Tennis", "Federer"); hm.entrySet().iterator().forEachRemaining(entry-> System.out.println("Key : "+entry.getKey()+" Value : "+entry.getValue())); > >

Other interesting articles which you may like …

  • Java 8 – Lambda Expressions
  • Java 8 – ForEach Example
  • Java 8 Default Methods in Interface
  • Multiple Inheritance in Java 8 through Interface
  • Java 9 – jdeprscan
  • Private Methods in Interfaces Java 9
  • Java Method Overloading Example
  • Java Constructor Overloading Example
  • Java this keyword | Core Java Tutorial
  • Java super keyword
  • Abstract Class in Java
  • Interface in Java and Uses of Interface in Java
  • What is Marker Interface
  • Serialization and Deserialization in Java with Example
  • Generate SerialVersionUID in Java
  • Java Autoboxing and Unboxing Examples
  • Use of Java Transient Keyword – Serailization Example
  • Use of static Keyword in Java
  • What is Method Overriding in Java
  • Encapsulation in Java with Example
  • Constructor in Java and Types of Constructors in Java
  • Final Keyword in Java | Java Tutorial
  • Java Static Import
  • Java – How System.out.println() really work?
  • Java Ternary operator
  • Java newInstance() method

Leave a Reply Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Источник

Итерация карты в Java с использованием метода entrySet()

В этом посте будут обсуждаться различные методы итерации карты в Java с использованием entrySet() метод.

Мы знаем это Map.entrySet() возвращает набор сопоставлений ключ-значение, содержащихся в карте. Итак, мы можем перебрать карту, используя Map.entrySet() , который содержит обе пары ключ-значение. Есть несколько способов сделать это:

1. Использование Iterator

Поскольку карта не расширяет Collection интерфейс, у него нет собственного итератора. Но Map.entrySet() возвращает набор сопоставлений ключ-значение, и поскольку Set расширяет Collection интерфейс, мы можем получить к нему итератор. Теперь мы можем легко обработать каждую пару ключ-значение, используя простой цикл while, как показано ниже:

2. Использование цикла for-each (расширенный оператор for)

Цикл for также имеет другую вариацию, предназначенную для итерации по коллекциям и массивам. Он называется циклом for-each и доступен любому объекту, реализующему цикл. Iterable интерфейс. В качестве Set расширяет Collection интерфейс и Collection расширяет Iterable интерфейс, мы можем использовать цикл for-each для прохода через entrySet. Обратите внимание, что этот подход также вызовет iterator() метод за кадром.

3. Использование Iterator.forEachRemaining() метод

Мы также можем использовать forEachRemaining() метод, который является последним дополнением к Iterator интерфейс в Java 8 и выше. Он выполняет данное действие для каждого оставшегося элемента, пока все элементы не будут обработаны.

Как было показано ранее, мы можем легко получить итератор для множества Map.Entry . Когда у нас есть итератор, мы можем передать ссылку на метод System.out::println или соответствующее лямбда-выражение E -> System.out.println(E) к forEachRemaining() метод, как показано ниже:

Источник

Паттерн Iterator

Java-университет

Как ты уже, вероятно, знаешь, в Java есть замечательный интерфейс Collection, реализующий интерфейс Iterator. Сразу оговорюсь, не следует путать интерфейс iterator с паттерном iterator в Java! И дабы внести ясность, для начала разберёмся именно с интерфейсом.

Дословно «Iterator» можно перевести как «переборщик». То есть это некая сущность, способная перебрать все элементы в коллекции. При этом она позволяет это сделать без вникания во внутреннюю структуру и устройство коллекций.

Представим на секунду, что iterator в Java отсутствует. В таком случае всем и каждому придётся нырнуть в самые глубины коллекций и по-настоящему разобраться, чем отличается, ArrayList от LinkedList и HashSet от TreeSet .

Методы, которые должен имплементировать Iterator

  • UnsupportedOperationException , если данный итератор не поддерживает метод remove() (в случае с read-only коллекциями, например)
  • IllegalStateException , если метод next() еще не был вызван, или если remove() уже был вызван после последнего вызова next() .
  • void add(E e) — вставляет элемент E в List ;
  • boolean hasPrevious() — вернет true , если при обратном переборе List имеются элементы;
  • int nextIndex() — вернет индекс следующего элемента;
  • E previous() — вернет предыдущий элемент листа;
  • int previousIndex() — вернет индекс предыдущего элемента;
  • void set(E e) — заменит элемент, возвращенный последним вызовом next() или previous() на элемент e .
 List list = new ArrayList<>(); list.add("Привет"); list.add("Обучающимся"); list.add("На"); list.add("JavaRush"); 
 Iterator iterator = list.iterator(); while (iterator.hasNext())

Сейчас будет «узкое место»: Java Collections как ты, вероятно, знаешь (а если не знаешь, разберись), расширяют интерфейс Iterable , но это не означает, что только List , Set и Queue поддерживают итератор. Для java Map iterator также поддерживается, но его необходимо вызывать для Map.entrySet() :

 Map map = new HashMap<>(); Iterator mapIterator = map.entrySet().iterator(); 

Тогда метод next() будет возвращать объект Entry , содержащий в себе пару «ключ»-«значение». Дальше все аналогично с List :

 while (mapIterator.hasNext()) < Map.Entryentry = mapIterator.next(); System.out.println("Key: " + entry.getKey()); System.out.println("Value: " + entry.getValue()); > 

Ты думаешь: «Стоп. Мы говорим про интерфейс, а в заголовке статьи написано «Паттерн». То есть, паттерн iterator – это интерфейс Iterator? Или интерфейс — это паттерн?» Если это слово встречается впервые, даю справку: паттерн — это шаблон проектирования, некое поведение, которого должен придерживаться класс или множество взаимосвязанных классов. Итератор в java может быть реализован для любого объекта, внутренняя структура которого подразумевает перебор, при этом можно изменить сигнатуру обсуждаемых методов. Главное при реализации паттерна – логика, которой должен придерживаться класс. Интерфейс итератор – частная реализация одноименного паттерна, применяемая как к готовым структурам ( List, Set, Queue, Map ), так и к прочим, на усмотрение программиста. Расширяя интерфейс Iterator, ты реализуешь паттерн, но для реализации паттерна не обязательно расширять интерфейс. Простая аналогия: все рыбы плавают, но не всё, что плавает – рыбы. В качестве примера я решил взять… слово. А конкретнее — существительное. Оно состоит из частей: приставки, корня, суффикса и окончания. Для частей слова создадим интерфейс WordPart и классы, расширяющие его: Prefix, Root, Suffix и Ending :

 interface WordPart < String getWordPart(); >static class Root implements WordPart < private String part; public Root(String part) < this.part = part; >@Override public String getWordPart() < return part; >> static class Prefix implements WordPart < private String part; public Prefix(String part) < this.part = part; >@Override public String getWordPart() < return part; >> static class Suffix implements WordPart < private String part; public Suffix(String part) < this.part = part; >@Override public String getWordPart() < return part; >> static class Ending implements WordPart < private String part; public Ending(String part) < this.part = part; >@Override public String getWordPart() < return part; >> 

Тогда класс Word (слово) будет содержать в себе части, а кроме них добавим целое число, отражающее количество частей в слове:

 public class Word < private Root root; private Prefix prefix; private Suffix suffix; private Ending ending; private int partCount; public Word(Root root, Prefix prefix, Suffix suffix, Ending ending) < this.root = root; this.prefix = prefix; this.suffix = suffix; this.ending = ending; this.partCount = 4; >public Word(Root root, Prefix prefix, Suffix suffix) < this.root = root; this.prefix = prefix; this.suffix = suffix; this.partCount = 3; >public Word(Root root, Prefix prefix) < this.root = root; this.prefix = prefix; this.partCount = 2; >public Word(Root root) < this.root = root; this.partCount = 1; >public Root getRoot() < return root; >public Prefix getPrefix() < return prefix; >public Suffix getSuffix() < return suffix; >public Ending getEnding() < return ending; >public int getPartCount() < return partCount; >public boolean hasRoot() < return this.root != null; >public boolean hasPrefix() < return this.prefix != null; >public boolean hasSuffix() < return this.suffix != null; >public boolean hasEnding()

Окей, у нас есть четыре перегруженных конструктора (для простоты, предположим, что суффикс у нас может быть только один). Существительное не может состоять из одной приставки, поэтому для конструктора с одним параметром будем устанавливать корень. Теперь напишем реализацию паттерна итератор: WordIterator, переопределяющий 2 метода: hasNext() и next() :

 public class WordIterator implements Iterator  < private Word word; private int wordPartsCount; public WordIterator(Word word) < this.word = word; this.wordPartsCount = word.getPartCount(); >@Override public boolean hasNext() < if (wordPartsCount == 4) < return word.hasPrefix() || word.hasRoot() || word.hasSuffix() || word.hasEnding(); >else if (wordPartsCount == 3) < return word.hasPrefix() || word.hasRoot() || word.hasSuffix(); >else if (wordPartsCount == 2) < return word.hasPrefix() || word.hasRoot(); >else if (wordPartsCount == 1) < return word.hasRoot(); >return false; > @Override public Word.WordPart next() throws NoSuchElementException < if (wordPartsCount try < if (wordPartsCount == 4) < return word.getEnding(); >if (wordPartsCount == 3) < return word.getSuffix(); >if (wordPartsCount == 2) < return word.getPrefix(); >return word.getRoot(); > finally < wordPartsCount--; >> > 
 public class Word implements Iterable < … @Override public Iteratoriterator() < return new WordIterator(this); >… > 

Источник

Оцените статью