1. 개요

우리는 종종 맵을 사용하여 키-값 쌍 모음을 저장합니다. 그런 다음 어떤 시점에서 종종 반복 해야 합니다 .

이 튜토리얼에서는 Map.Entry 를 사용하는 것이 도움이 될 수있는시기를 강조하면서 여러 맵 반복 방법을 비교 합니다. 그런 다음 Map.Entry 를 사용하여 튜플을 만드는 방법을 배웁니다  . 마지막으로 정렬 된 튜플 List을 생성합니다.

2. 반복 최적화

저자의 이름을 키로하는 책 제목의Map가 있다고 가정합니다.

Map<String, String> map = new HashMap<>();

map.put("Robert C. Martin", "Clean Code");
map.put("Joshua Bloch", "Effective Java");

Map에서 모든 키와 값을 가져 오는 두 가지 방법을 비교해 보겠습니다.

2.1. Map.keySet 사용

먼저 다음 사항을 고려하십시오.

for (String key : bookMap.keySet()) {
    System.out.println("key: " + key + " value: " + bookMap.get(key));
}

여기서 루프는 keySet을 반복 합니다. 각 키에 대해 Map.get을 사용하여 해당 값을 얻습니다 . 이것은 맵의 모든 항목을 사용하는 명백한 방법이지만 각 항목에 대해 두 가지 작업이 필요합니다. 하나는 다음 키를 가져오고 다른 하나는 get을 사용 하여 값을 조회합니다 .

맵에 키만 필요한 경우 keySet 이 좋은 옵션입니다. 그러나 키와 값을 모두 얻는 더 빠른 방법이 있습니다.

2.2. 대신 Map.entrySet 사용 

entrySet 을 사용하도록 반복을 다시 작성해 보겠습니다 .

for (Map.Entry<String, String> book: bookMap.entrySet()) {
    System.out.println("key: " + book.getKey() + " value: " + book.getValue());
}

이 예제에서 루프는 Map.Entry 객체 컬렉션에 있습니다. 으로  의 Map.Entry의 하나 개의 클래스에 저장 키와 값 함께 모두, 우리는 한 번의 조작으로 둘 다 얻을 .

Java 8 스트림 작업 사용 에도 동일한 규칙이 적용됩니다 . entrySet을 통한 스트리밍 Entry 객체 작업  이 더 효율적이며 더 적은 코드가 필요할 수 있습니다.

3. 튜플 작업

튜플은 요소의 수와 순서가 고정 된 데이터 구조입니다. Map.Entry 는 키와 값이라는 두 가지 요소를 저장하는 튜플 이라고 생각할 수 있습니다  . 그러나  Map.Entry 는 인터페이스이므로 구현 클래스가 필요합니다. 이 섹션에서는 JDK에서 제공하는 하나의 구현 인 AbstractMap.SimpleEntry를 살펴 보겠습니다 .

3.1. 튜플 생성

먼저 Book 클래스를 고려하십시오 .

public class Book {
    private String title;
    private String author;

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }
    ...

다음으로 ISBN을 키로 사용하고 Book 개체를 값으로 사용하는 Map.Entry 튜플을 만들어 보겠습니다 .

Map.Entry<String, Book> tuple;

마지막으로 AbstractMap.SimpleEntry를 사용 하여 튜플을 인스턴스화 해 보겠습니다  .

tuple = new AbstractMap.SimpleEntry<>("9780134685991", new Book("Effective Java 3d Edition", "Joshua Bloch"));

3.2. 정렬 된 튜플 List 만들기

튜플을 작업 할 때 정렬 된 List으로 사용하는 것이 유용한 경우가 많습니다.

먼저 튜플 List을 정의합니다.

List<Map.Entry<String, Book>> orderedTuples = new ArrayList<>();

둘째, List에 몇 가지 항목을 추가해 보겠습니다.

orderedTuples.add(new AbstractMap.SimpleEntry<>("9780134685991", 
  new Book("Effective Java 3d Edition", "Joshua Bloch")));
orderedTuples.add(new AbstractMap.SimpleEntry<>("9780132350884", 
  new Book("Clean Code","Robert C Martin")));

3.3. Map 와 비교

Map 과의 차이점을 비교하기 위해 이미 존재하는 키가있는 새 항목을 추가해 보겠습니다.

orderedTuples.add(new AbstractMap.SimpleEntry<>("9780132350884", 
  new Book("Clean Code", "Robert C Martin")));

둘째, 모든 키와 값을 표시하면서 List을 반복합니다.

for (Map.Entry<String, Book> tuple : orderedTuples) {
    System.out.println("key: " + tuple.getKey() + " value: " + tuple.getValue());
}

마지막으로 출력을 보겠습니다.

key: 9780134685991 value: Book{title='Effective Java 3d Edition', author='Joshua Bloch'}
key: 9780132350884 value: Book{title='Clean Code', author='Robert C Martin'}
key: 9780132350884 value: Book{title='Clean Code', author='Robert C Martin'}

각 키가 고유 해야하는 기본 Map 과 달리 중복 키를 가질 수 있습니다  . 이는 SimpleEntry 객체 를 저장하기 위해 List 구현을 사용했기 때문입니다. 이는 모든 객체가 서로 독립적임을 의미합니다.

3.4. 항목 개체 List

Entry 의 목적은  일반 튜플 역할을하는 것이 아닙니다. 라이브러리 클래스는 종종 이러한 목적을 위해 일반 Pair 클래스를 제공 합니다  .

그러나 Map에 대한 데이터를 준비 하거나 하나에서 데이터를 추출 하는 동안 항목 List으로 일시적으로 작업해야 할 수도 있습니다  .

4. 결론

이 기사에서는 맵의 키를 반복하는 대신 Map.entrySet살펴 보았습니다  .

그런 다음 Map.Entry 를 튜플로 사용 하는 방법을 살펴 보았습니다 .

마지막으로, 우리는 기본 Map 과 차이점을 비교하여 정렬 된 튜플 List을 만들었습니다 .

항상 그렇듯이 예제 코드는 GitHub에서 사용할 수 있습니다 .