Map 과HashMap, EntrySet() 메소드

HootJem🦉·2024년 6월 24일
0

상황

백준 문제를 풀다가 오답을 맞이하게 된다.

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main_7785 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        sc.nextLine(); // 정수 입력 후의 개행 처리

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

        for (int i = 0; i < N; i++) {
            String stfs = sc.nextLine();
            String[] stf = stfs.split(" ");
            String name = stf[0];
            String record = stf[1];

            stfMap.put(name, record);
        }


        sc.close();
    }
}

Map 에 자료는 넣었는데 이제 어떻게 꺼내는 걸까. (이름 내림차순으로 꺼내야함)

1. Entry, entrySet() 알아보기

이때 사용되는게 바로 Entry !!

System.out.println("Original HashMap: "+stfMap);
System.out.println("HashMap.entrySet(): " +stfMap.entrySet());

map 과 entrySet()을 사용하여 로그를 찍어보면 다음과 같이 반환하는데

Original HashMap: {Artem=enter, Askar=enter, Baha=leave}
HashMap.entrySet(): [Artem=enter, Askar=enter, Baha=leave]

map 은 키와 값의 형태로 출력한 것이며 객체를 나타내고
entrySet()은 메서드를 통해 반환된 Set의 내용(컬렉션)을 보여주는것.

Java 에서 Collections.sort()를 사용하여 정렬을 하려면 일반적으로 List 형태로 정렬할 데이터를 가지고 있어야 한다.
나는 Map 을 정렬해야 하기 때문에
1. entrySet() 을 사용하여 Map 의 각 항목을 Set 형태로 가져온 뒤
2. List 로 변환하여 Collections.sort() 사용해 정렬한다.

따라서 해당 코드를 추가한다.

List<Map.Entry<String, String>> entryList = new ArrayList<>(stfMap.entrySet());
		
		Collections.sort(entryList, new Comparator<Map.Entry<String, String>>() {

			@Override
			public int compare(Entry<String, String> o1, Entry<String, String> o2) {
				
				return o2.getKey().compareTo(o1.getKey());
			}
			
		});

compare 메서드는 두개의 Map.Entry<String, String> 객체를 받아와서 비교한다. o1, o2 를 비교하여 정렬 순서를 결정하게 된다.

  • o2.getKey().compareTo(o1.getKey()) 는 두 엔트리의 키를 비교한다.
  • compareTo 메서드는 String 클래스에서 상속받은 메서드로, 문자열을 사전 순으로 비교한다.
    • 음수: o2의 키가 o1의 키보다 사전 순으로 앞에 위치함.
    • 0: o2o1의 키가 같음.
    • 양수: o2의 키가 o1의 키보다 사전 순으로 뒤에 위치함.

이를 통해 역순으로 정렬하게 됨.

2. 결과

public class Main_7785 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		sc.nextLine();
		
		Map<String, String> stfMap = new HashMap<>();
		
		for(int i=0; i<N; i++) {
			String stfs = sc.nextLine();
			String[] stf = stfs.split(" ");
			String name = stf[0];
			String record= stf[1];
			
			stfMap.put(name, record);
		}
		
		List<Map.Entry<String, String>> entryList = new ArrayList<>(stfMap.entrySet());
		
		Collections.sort(entryList, new Comparator<Map.Entry<String, String>>() {

			@Override
			public int compare(Entry<String, String> o1, Entry<String, String> o2) {
				
				return o2.getKey().compareTo(o1.getKey());
			}
			
		});
		
		for(Map.Entry<String, String> entry : entryList) {
			if(entry.getValue().equals("enter")) {
				System.out.println(entry.getKey());
			}
		}
			
		sc.close();
	}
}
profile
뉴비 백엔드 개발자

0개의 댓글