본문 바로가기
Chapter01/Java

[ Java ] 이중해시맵 + 예시코드

by EmmaDev_v 2024. 6. 17.

이중해시맵

: 키-값 쌍을 저장하는 해시맵이 또 다른 해시맵을 값으로 가지는 구조. 
특정 키에 대한 다중 값을 관리하는 데 유용함.
자바에서는 HashMap 클래스를 사용하여 이중 해시맵을 구현할 수 있음.

 

 


해시맵과 비교

//해시맵
Map<String, Integer> studentScores = new HashMap<>();
studentScores.put("Alice", 90);
studentScores.put("Bob", 75);


//이중해시맵
Map<String, Map<String, Integer>> studentGrades = new HashMap<>();

Map<String, Integer> aliceGrades = new HashMap<>();
aliceGrades.put("Math", 90);
aliceGrades.put("Science", 85);

Map<String, Integer> bobGrades = new HashMap<>();
bobGrades.put("Math", 75);
bobGrades.put("Science", 80);

studentGrades.put("Alice", aliceGrades);
studentGrades.put("Bob", bobGrades);

 

studentScores 

Key Value
Alice  90  
Bob    75

 

studentGrades

Key Value 
Alice  { Math=90 , Science=85 } 
Bob    { Math=75,  Science=80 }  

즉, 이중 HashMap의 Value가 Key와 Value로 구성되어있음.    

 

 

 

 

해시맵 내부에 또 다른 해시맵을 값으로 가지는 구조이므로, 주로 2차원 데이터를 저장하거나 키와 관련된 여러 값을 그룹화할 때 유용함.

 

이중 해시맵 사용한 예시코드! 

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

public class DoubleHashMapExample {
    public static void main(String[] args) {
        // 이중 해시맵 생성해 학생들 성적을 추가함
        Map<String, Map<String, Integer>> studentGrades = new HashMap<>();
        addGrade(studentGrades, "Alice", "Math", 90);
        addGrade(studentGrades, "Alice", "Science", 85);
        addGrade(studentGrades, "Bob", "Math", 75);
        addGrade(studentGrades, "Bob", "Science", 80);
        
        printGrades(studentGrades);
        
        // 특정 학생의 특정 과목 성적 조회
        int aliceMathGrade = getGrade(studentGrades, "Alice", "Math");
        System.out.println("Alice's Math grade: " + aliceMathGrade);
    }
    
    // 성적 추가 메소드
    public static void addGrade(Map<String, Map<String, Integer>> studentGrades, 
                                String studentName, String subject, int grade) {
        studentGrades
            .computeIfAbsent(studentName, k -> new HashMap<>())
            .put(subject, grade);
    }
    
    // 성적 조회 메소드
    public static int getGrade(Map<String, Map<String, Integer>> studentGrades, 
                               String studentName, String subject) {
        return studentGrades
            .getOrDefault(studentName, new HashMap<>())
            .getOrDefault(subject, 0);
    }
    
    // 성적 출력 메소드
    public static void printGrades(Map<String, Map<String, Integer>> studentGrades) {
        for (String student : studentGrades.keySet()) {
            System.out.println("Grades for " + student + ":");
            Map<String, Integer> grades = studentGrades.get(student);
            for (String subject : grades.keySet()) {
                System.out.println("  " + subject + ": " + grades.get(subject));
            }
        }
    }
}

 

 

studentGrades라는 이중 해시맵의 첫 번째 키는 학생의 이름, 두 번째 키는 과목 이름, 값은 성적.

성적 추가 메소드  : 주어진 학생 이름이 없으면 새로운 해시맵을 생성하고, 과목 이름과 성적을 추가

성적 조회 메소드: 주어진 학생의 특정 과목 성적을 조회. 해당 학생이나 과목이 없으면 기본값 0을 반환

성적 출력 메소드 : 모든 학생의 성적 출력.

반응형