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을 만들었습니다 .