Java Map 에서 최대값 찾는 방법

JavaBeginner
지금 연습하기

소개

Java 에서 Map 데이터 구조는 키 - 값 쌍으로 데이터를 저장하는 인터페이스입니다. 배열이나 리스트와 달리, Map 은 삽입 순서를 유지하지 않으므로 최대값을 찾는 것이 더 어려울 수 있습니다. 이 랩에서는 데이터 처리 애플리케이션에서 흔히 사용되는 작업인 Map 에서 최대값을 찾는 다양한 접근 방식을 안내합니다.

두 가지 주요 방법을 배우게 됩니다.

  • 모든 값을 비교하기 위한 루프를 사용하는 반복적 접근 방식
  • Collections 유틸리티 클래스를 사용하는 내장 접근 방식

이 랩을 마치면 데이터 조작 작업에 필수적인 기술인 Java Map 에서 극단적인 값을 효율적으로 찾는 방법을 이해하게 될 것입니다.

Java Map 이해 및 생성

Java 의 Map 인터페이스는 각 키가 고유한 키 - 값 쌍을 저장하는 데 사용됩니다. 이 단계에서는 코스 이름을 키로, 해당 가격을 값으로 저장하는 간단한 Map 을 생성합니다.

Java 에서 Map 이란 무엇인가요?

Java 의 Map 은 다음과 같습니다.

  • 키 - 값 쌍을 포함합니다.
  • 중복된 키를 포함할 수 없습니다.
  • 각 키는 최대 하나의 값에 매핑될 수 있습니다.
  • 일반적으로 사용되는 구현으로는 HashMap, TreeMap 및 LinkedHashMap 이 있습니다.

Java Map 예제 생성

Map 을 시연하기 위해 WebIDE 에서 파일을 생성해 보겠습니다.

  1. WebIDE 에서 MaxValueInMap.java라는 새 파일을 생성합니다.
  2. 다음 코드를 파일에 복사합니다.
import java.util.*;

public class MaxValueInMap {
    public static void main(String args[]) {
        // Create a HashMap to store course prices
        Map<String, Integer> coursePrice = new HashMap<>();

        // Add key-value pairs to the map
        coursePrice.put("Java", 5000);
        coursePrice.put("Python", 3000);
        coursePrice.put("CPP", 4000);
        coursePrice.put("Android", 8000);

        // Print the entire map
        System.out.println("Course price map: " + coursePrice);
    }
}
  1. "File" > "Save"를 클릭하거나 Ctrl+S 를 눌러 파일을 저장합니다.

  2. WebIDE 에서 터미널을 열고 다음 명령을 실행하여 프로그램을 컴파일하고 실행합니다.

javac MaxValueInMap.java && java MaxValueInMap

다음과 유사한 출력을 볼 수 있습니다.

Course price map: {Java=5000, CPP=4000, Android=8000, Python=3000}

요소의 순서가 삽입 순서와 다를 수 있습니다. 이는 HashMap이 요소의 특정 순서를 유지하지 않기 때문입니다.

반복문을 사용하여 최대값 찾기

Map 에서 최대값을 찾는 한 가지 방법은 모든 항목을 반복하고 지금까지 발견된 최대값을 추적하는 것입니다. 이 접근 방식은 모든 Map 구현에서 작동합니다.

Map.Entry 란 무엇인가요?

Map.Entry는 Map 에서 키 - 값 쌍을 나타내는 인터페이스입니다. 쌍에서 키와 값 모두에 액세스하는 메서드를 제공합니다.

반복적 접근 방식 구현

반복을 사용하여 최대 코스 가격을 찾도록 Java 프로그램을 수정해 보겠습니다.

  1. WebIDE 에서 MaxValueInMap.java 파일을 엽니다.

  2. 기존 코드를 다음으로 바꿉니다.

import java.util.*;

public class MaxValueInMap {
    public static void main(String args[]) {
        // Create a HashMap to store course prices
        Map<String, Integer> coursePrices = new HashMap<>();

        // Variable to store the entry with maximum price
        Map.Entry<String, Integer> maxEntry = null;

        // Add key-value pairs to the map
        coursePrices.put("Java", 5000);
        coursePrices.put("Python", 3000);
        coursePrices.put("CPP", 4000);
        coursePrices.put("Android", 8000);

        System.out.println("Course price map: " + coursePrices);

        // Iterate through each entry in the map
        for (Map.Entry<String, Integer> entry : coursePrices.entrySet()) {
            // If maxEntry is null OR current entry's value is greater than maxEntry's value
            if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0) {
                maxEntry = entry;
            }
        }

        // Print the maximum price and its corresponding course
        System.out.println("Course with maximum price: " + maxEntry.getKey());
        System.out.println("Maximum price: " + maxEntry.getValue());
    }
}
  1. 파일을 저장합니다.

  2. 다음 명령으로 프로그램을 실행합니다.

javac MaxValueInMap.java && java MaxValueInMap

다음과 유사한 출력을 볼 수 있습니다.

Course price map: {Java=5000, CPP=4000, Android=8000, Python=3000}
Course with maximum price: Android
Maximum price: 8000

반복 방식 작동 방식

  1. maxEntry 변수를 생성하고 초기값을 null로 설정합니다.
  2. entrySet() 메서드를 사용하여 Map 의 각 항목을 반복합니다.
  3. 각 항목에 대해 해당 값을 현재 최대값과 비교합니다.
  4. 현재 항목의 값이 더 크거나 maxEntry가 여전히 null인 경우 maxEntry를 업데이트합니다.
  5. 반복을 완료한 후 maxEntry는 최대값을 가진 항목을 저장합니다.

이 접근 방식은 최대 항목의 키와 값 모두가 필요한 경우 유용합니다.

Collections.max() 를 사용한 최대값 찾기

Java 는 Collections.max() 메서드를 사용하여 컬렉션에서 최대값을 찾는 더 간결한 방법을 제공합니다. 이 메서드는 Map 의 값을 포함하여 모든 컬렉션에 적용할 수 있습니다.

Collections.max() 이해

Collections.max() 메서드는 다음과 같습니다.

  • 컬렉션을 입력으로 받아 최대 요소를 반환합니다.
  • 요소의 자연 순서 또는 사용자 지정 비교자를 사용합니다.
  • 반복적 접근 방식보다 더 간결합니다.
  • 최대값만 반환하며, 관련 키는 반환하지 않습니다.

Map 값에 Collections.max() 구현

Collections.max()를 사용하도록 프로그램을 수정해 보겠습니다.

  1. WebIDE 에서 MaxValueInMap.java 파일을 엽니다.

  2. 기존 코드를 다음으로 바꿉니다.

import java.util.*;

public class MaxValueInMap {
    public static void main(String args[]) {
        // Create a HashMap to store course prices
        Map<String, Integer> coursePrice = new HashMap<>();

        // Add key-value pairs to the map
        coursePrice.put("Java", 5000);
        coursePrice.put("Python", 3000);
        coursePrice.put("CPP", 4000);
        coursePrice.put("Android", 8000);

        System.out.println("Course price map: " + coursePrice);

        // Find maximum value using Collections.max()
        Integer maxPrice = Collections.max(coursePrice.values());

        System.out.println("Maximum price: " + maxPrice);

        // To find the key associated with the maximum value
        for (Map.Entry<String, Integer> entry : coursePrice.entrySet()) {
            if (entry.getValue().equals(maxPrice)) {
                System.out.println("Course with maximum price: " + entry.getKey());
                break;  // Exit the loop once we find the key
            }
        }
    }
}
  1. 파일을 저장합니다.

  2. 다음 명령으로 프로그램을 실행합니다.

javac MaxValueInMap.java && java MaxValueInMap

다음과 유사한 출력을 볼 수 있습니다.

Course price map: {Java=5000, CPP=4000, Android=8000, Python=3000}
Maximum price: 8000
Course with maximum price: Android

Collections.max() 작동 방식

  1. coursePrice.values() 메서드는 Map 의 모든 값에 대한 Collection 뷰를 반환합니다.
  2. Collections.max()는 이 컬렉션에서 최대 요소를 찾습니다.
  3. 그런 다음 Map 을 반복하여 이 최대값과 관련된 키를 찾습니다.

이 접근 방식은 이전 반복적 메서드보다 더 간결하지만 관련 키를 찾기 위해 추가 단계가 필요합니다.

Map 에서 최대 Key 값 찾기

지금까지 Map 에서 최대값을 찾는 데 집중했습니다. 그러나 때로는 대신 최대 키를 찾아야 할 수도 있습니다. 이는 키에 자연스러운 순서가 있고 중요한 의미를 갖는 시나리오에서 일반적입니다.

Map 키와 값 이해

Map 에서:

  • 키는 고유 식별자입니다.
  • 값은 각 키와 관련된 데이터입니다.
  • 키는 Comparable 인터페이스를 구현하는 경우 정렬될 수 있습니다.
  • 최대 키를 찾으려면 values() 대신 keySet()을 사용합니다.

가격을 키로 하는 Map 생성

가격을 키로 하고 코스 이름을 값으로 하는 새로운 예제를 만들어 보겠습니다.

  1. WebIDE 에서 MaxValueInMap.java 파일을 엽니다.

  2. 기존 코드를 다음으로 바꿉니다.

import java.util.*;

public class MaxValueInMap {
    public static void main(String args[]) {
        // Create a HashMap with prices as keys and course names as values
        Map<Integer, String> priceMap = new HashMap<>();

        // Add key-value pairs to the map
        priceMap.put(5000, "Java");
        priceMap.put(3000, "Python");
        priceMap.put(4000, "CPP");
        priceMap.put(8000, "Android");

        System.out.println("Price to course map: " + priceMap);

        // Find maximum key using Collections.max()
        Integer maxPrice = Collections.max(priceMap.keySet());

        System.out.println("Maximum price: " + maxPrice);
        System.out.println("Course with maximum price: " + priceMap.get(maxPrice));

        // Find minimum key using Collections.min()
        Integer minPrice = Collections.min(priceMap.keySet());

        System.out.println("Minimum price: " + minPrice);
        System.out.println("Course with minimum price: " + priceMap.get(minPrice));
    }
}
  1. 파일을 저장합니다.

  2. 다음 명령으로 프로그램을 실행합니다.

javac MaxValueInMap.java && java MaxValueInMap

다음과 유사한 출력을 볼 수 있습니다.

Price to course map: {3000=Python, 4000=CPP, 5000=Java, 8000=Android}
Maximum price: 8000
Course with maximum price: Android
Minimum price: 3000
Course with minimum price: Python

이 접근 방식의 주요 차이점

  1. Map 구조가 반전되었습니다. 이제 가격이 키이고 코스 이름이 값입니다.
  2. 모든 키를 가져오기 위해 values() 대신 keySet()을 사용합니다.
  3. get(maxPrice)를 사용하여 해당 값을 직접 액세스할 수 있습니다.
  4. Collections.min()을 사용하여 최소 가격을 찾는 예제도 추가했습니다.

이 접근 방식은 비교하려는 숫자 값이 이미 Map 에서 키로 사용되고 있는 경우 유용합니다.

요약

이 랩에서는 Java Map 에서 최대값을 찾는 여러 가지 방법을 배웠습니다.

  1. 반복적 접근 방식 (Iterative Approach): 루프를 사용하여 Map 항목을 반복하고 값을 비교합니다.

    • 최대값과 관련 키를 모두 제공합니다.
    • 모든 Map 구현에서 작동합니다.
    • 사용자 지정 비교 로직에 유용합니다.
  2. 값에 대한 Collections.max(): 내장된 Collections 유틸리티를 사용하여 최대값을 찾습니다.

    • 반복적 접근 방식보다 더 간결한 코드입니다.
    • 관련 키를 찾기 위해 추가 단계가 필요합니다.
    • 요소의 자연 순서를 사용합니다.
  3. 키에 대한 Collections.max(): Map 에서 최대 키를 찾습니다.

    • 키에 의미 있는 숫자 값이 있는 경우 유용합니다.
    • get()을 사용하여 관련 값에 직접 액세스합니다.
    • 최소값을 찾기 위해 Collections.min() 과 함께 사용할 수도 있습니다.

이러한 기술은 데이터 컬렉션에서 극단적인 값을 찾는 데이터 처리 애플리케이션, 데이터베이스 결과 처리, 통계 계산 및 기타 많은 프로그래밍 시나리오에서 널리 사용됩니다.

Java 컬렉션으로 계속 작업할 때 키, 값 또는 둘 다 필요한지, 사용자 지정 비교 로직이 필요한지 여부를 포함하여 특정 요구 사항에 따라 선택하는 접근 방식이 달라져야 함을 기억하십시오.