JavaRush /Java Blog /Random-KO /지도 인터페이스에 관해 가장 많이 묻는 질문에 대한 답변

지도 인터페이스에 관해 가장 많이 묻는 질문에 대한 답변

Random-KO 그룹에 게시되었습니다
안녕하세요! 오늘 우리는 Map에 관한 가장 일반적인 질문에 대한 답변을 제공할 것입니다. 하지만 먼저 그것이 무엇인지 기억해 봅시다. 지도 인터페이스에 관해 가장 많이 묻는 질문에 대한 답변 - 1맵은 키-값 쌍 집합을 포함하는 데이터 구조입니다. 그 데이터 구조는 사전과 유사하므로 종종 그렇게 불립니다. 동시에 Map은 인터페이스 이며 표준 jdk에는 Hashmap, LinkedHashMap, Hashtable, TreeMap과 같은 주요 구현이 포함되어 있습니다. 가장 많이 사용되는 구현은 Hashmap이므로 예제에서는 이를 사용하겠습니다. 지도의 표준 생성 및 채우기는 다음과 같습니다.
Map<Integer, String> map = new HashMap<>();
map.put(1, "string 1");
map.put(2, "string 2");
map.put(3, "string 3");
그리고 이것은 키로 값을 얻는 방법입니다:
String string1 = map.get(1);
String string2 = map.get(2);
String string3 = map.get(3);
위의 사항이 모두 명확하다면 인기있는 질문에 대한 답변을 진행하겠습니다!

0. 모든 Map 값을 반복하는 방법

값을 반복하는 것은 맵을 사용하여 수행하는 가장 일반적인 작업입니다. 모든 키-값 쌍은 내부 Map.Entry 인터페이스에 저장되며 이를 가져오려면 entrySet(). 다음을 통해 반복될 수 있는 쌍 세트를 반환합니다.
for(Map.Entry<Integer, String> entry: map.entrySet()) {
   // get key
   Integer key = entry.getKey();
   // get value
   String value = entry.getValue();
}

Или используя итератор:
Iterator<Map.Entry<Integer, String>> itr = map.entrySet().iterator();
while(itr.hasNext()) {
   Map.Entry<Integer, String> entry =  itr.next();
   // get key
   Integer key = entry.getKey();
   // get value
   String value = entry.getValue();
}

1. 지도를 리스트로 변환하는 방법

Map 인터페이스에는 요소 목록을 반환하는 3가지 메서드가 있습니다.
  • keySet() - 키 세트를 반환합니다.
  • 값() - 값 컬렉션을 반환합니다.
  • EntrySet() - 키-값 세트 세트를 반환합니다.
클래스의 생성자를 살펴보면 ArrayListCollection 유형의 인수를 가진 생성자가 있음을 알 수 있습니다. Set은 Collection의 자손이기 때문에 위의 모든 메소드의 결과는 클래스의 생성자에 전달될 수 있습니다 ArrayList. 따라서 새 목록을 만들고 다음 값으로 채울 것입니다 Map.
// key list
List<Integer> keyList = new ArrayList<>(map.keySet());
// value list
List<String> valueList = new ArrayList<>(map.values());
// key-value list
List<Map.Entry<Integer, String>> entryList = new ArrayList<>(map.entrySet());

2. 맵키 정렬 방법

지도 정렬은 프로그래밍에서 상당히 일반적인 작업이기도 합니다. 여러 가지 방법으로 이 작업을 수행할 수 있습니다.
  1. Map.Entry를 목록에 넣고 Comparator를 사용하여 정렬합니다 .

    비교기에서는 쌍의 키만 비교합니다.

    List> list = new ArrayList(map.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
       @Override
       public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
           return o1.getKey() - o2.getKey();
       }
    });
    

    람다를 이해한다면 이 항목을 상당히 단축할 수 있습니다.

    Collections.sort(list, Comparator.comparingInt(Map.Entry::getKey));
  2. 을 사용하거나 더 정확하게 는 생성자에서 Comparator를 사용하는 SortedMap구현을 사용하세요. TreeMap이 비교기는 맵 키에 적용되므로 키는 인터페이스를 구현하는 클래스여야 합니다 Comparable.

    SortedMap<Integer, String> sortedMap = new TreeMap<>(new Comparator<Integer>() {
       @Override
       public int compare(Integer o1, Integer o2) {
           return o1 - o2;
       }
    });

    물론 람다를 사용하여 모든 것을 다시 작성할 수 있습니다.

    SortedMap<Integer, String> sortedMap = new TreeMap<>(Comparator.comparingInt(o -> o));

    첫 번째 방법과 달리 SortedMap을 사용하면 항상 정렬된 형식으로 데이터를 저장합니다.

3. 맵 값을 정렬하는 방법

여기서는 키에 대한 첫 번째 접근 방식과 유사한 접근 방식을 사용해야 합니다. 값 목록을 가져와 목록에서 정렬합니다.
List <Map.Entry<Integer, String>> valuesList = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
   @Override
   public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
       return o1.getValue().compareTo(o2.getValue());
   }
});
이에 대한 람다는 다음과 같습니다.
Collections.sort(list, Comparator.comparing(Map.Entry::getValue));

4. HashMap, TreeMap, Hashtable의 차이점은 무엇인가요?

앞서 언급했듯이 Map 인터페이스에는 3가지 주요 구현이 있습니다. 각각에는 고유한 특성이 있습니다.
  1. 요소의 순서. 항목이 추가된 순서대로 저장된다는 보장은 없습니다 HashMap. Hashtable또한 시간이 지나도 요소의 순서가 변경되지 않는다는 점을 보장하지 않습니다. 결과적으로 추가된 순서 대로 TreeMap또는 지정된 비교기에 따라 요소의 저장을 보장합니다.

  2. 유효한 값. HashMap키와 null 값을 가질 수 있습니다. HashTable아니요. TreeMap은 비교기가 허용하는 경우에만 null 값을 사용할 수 있습니다. 비교기를 사용하지 않으면(추가된 순서대로 쌍을 저장하여) null이 허용되지 않습니다.

  3. 동기화. 동기화 만 HashTable되고 나머지는 동기화되지 않습니다. 다른 스레드에서 맵에 액세스하지 않는 경우 HashTable 대신 HashMap을 사용하는 것이 좋습니다.

구현에 대한 일반적인 비교는 다음과 같습니다.
해시맵 해시테이블 트리맵
요소의 순서 아니요 아니요
값으로 null 아니요 설마
스레드 안전성 아니요 아니요
요소 검색의 알고리즘 복잡성 오(1) 오(1) O(로그 n)
내부 데이터 구조 해시 테이블 해시 테이블 레드 블랙 트리

5. 양방향 지도를 만드는 방법

때로는 키와 값이 모두 고유한 데이터 구조, 즉 맵에 키-키 쌍이 포함되는 데이터 구조를 사용해야 하는 경우가 있습니다. 이 데이터 구조를 사용하면 지도에서 "역전된 보기/검색"을 만들 수 있습니다. 즉, 값으로 키를 찾을 수 있는데, 이 데이터 구조를 양방향 맵이라고 하는데 안타깝게도 JDK에서는 지원하지 않습니다. 그러나 다행스럽게도 해당 구현은 Apache Common Collections 또는 Guava 라이브러리에서 찾을 수 있습니다. 여기서는 각각 BidiMap 및 BiMap이라고 합니다. 이러한 구현은 키와 값의 고유성에 제한을 둡니다. 이는 일대일 관계를 형성합니다.

6. 빈 지도를 만드는 방법

빈 지도를 만드는 방법에는 두 가지가 있습니다.
  1. 일반 객체 초기화:

    Map<Integer, String> emptyMap = new HashMap<>();
  2. 불변의 빈 맵 만들기:

    Map<Integer, String> emptyMap =  Collections.emptyMap();
그러한 지도에 데이터를 추가하려고 하면 다음과 같은 UnsupportedOperationException예외가 발생합니다. 이 글에서는 지도 인터페이스를 사용할 때 가질 수 있는 가장 일반적인 질문을 살펴보았습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION