소개
Java 에서 Map 데이터 구조는 키 - 값 쌍으로 데이터를 저장하는 인터페이스입니다. 배열이나 리스트와 달리, Map 은 삽입 순서를 유지하지 않으므로 최대값을 찾는 것이 더 어려울 수 있습니다. 이 랩에서는 데이터 처리 애플리케이션에서 흔히 사용되는 작업인 Map 에서 최대값을 찾는 다양한 접근 방식을 안내합니다.
두 가지 주요 방법을 배우게 됩니다.
- 모든 값을 비교하기 위한 루프를 사용하는 반복적 접근 방식
- Collections 유틸리티 클래스를 사용하는 내장 접근 방식
이 랩을 마치면 데이터 조작 작업에 필수적인 기술인 Java Map 에서 극단적인 값을 효율적으로 찾는 방법을 이해하게 될 것입니다.
Java Map 이해 및 생성
Java 의 Map 인터페이스는 각 키가 고유한 키 - 값 쌍을 저장하는 데 사용됩니다. 이 단계에서는 코스 이름을 키로, 해당 가격을 값으로 저장하는 간단한 Map 을 생성합니다.
Java 에서 Map 이란 무엇인가요?
Java 의 Map 은 다음과 같습니다.
- 키 - 값 쌍을 포함합니다.
- 중복된 키를 포함할 수 없습니다.
- 각 키는 최대 하나의 값에 매핑될 수 있습니다.
- 일반적으로 사용되는 구현으로는 HashMap, TreeMap 및 LinkedHashMap 이 있습니다.
Java Map 예제 생성
Map 을 시연하기 위해 WebIDE 에서 파일을 생성해 보겠습니다.
- WebIDE 에서
MaxValueInMap.java라는 새 파일을 생성합니다. - 다음 코드를 파일에 복사합니다.
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);
}
}
"File" > "Save"를 클릭하거나 Ctrl+S 를 눌러 파일을 저장합니다.
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 프로그램을 수정해 보겠습니다.
WebIDE 에서
MaxValueInMap.java파일을 엽니다.기존 코드를 다음으로 바꿉니다.
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());
}
}
파일을 저장합니다.
다음 명령으로 프로그램을 실행합니다.
javac MaxValueInMap.java && java MaxValueInMap
다음과 유사한 출력을 볼 수 있습니다.
Course price map: {Java=5000, CPP=4000, Android=8000, Python=3000}
Course with maximum price: Android
Maximum price: 8000
반복 방식 작동 방식
maxEntry변수를 생성하고 초기값을null로 설정합니다.entrySet()메서드를 사용하여 Map 의 각 항목을 반복합니다.- 각 항목에 대해 해당 값을 현재 최대값과 비교합니다.
- 현재 항목의 값이 더 크거나
maxEntry가 여전히null인 경우maxEntry를 업데이트합니다. - 반복을 완료한 후
maxEntry는 최대값을 가진 항목을 저장합니다.
이 접근 방식은 최대 항목의 키와 값 모두가 필요한 경우 유용합니다.
Collections.max() 를 사용한 최대값 찾기
Java 는 Collections.max() 메서드를 사용하여 컬렉션에서 최대값을 찾는 더 간결한 방법을 제공합니다. 이 메서드는 Map 의 값을 포함하여 모든 컬렉션에 적용할 수 있습니다.
Collections.max() 이해
Collections.max() 메서드는 다음과 같습니다.
- 컬렉션을 입력으로 받아 최대 요소를 반환합니다.
- 요소의 자연 순서 또는 사용자 지정 비교자를 사용합니다.
- 반복적 접근 방식보다 더 간결합니다.
- 최대값만 반환하며, 관련 키는 반환하지 않습니다.
Map 값에 Collections.max() 구현
Collections.max()를 사용하도록 프로그램을 수정해 보겠습니다.
WebIDE 에서
MaxValueInMap.java파일을 엽니다.기존 코드를 다음으로 바꿉니다.
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
}
}
}
}
파일을 저장합니다.
다음 명령으로 프로그램을 실행합니다.
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() 작동 방식
coursePrice.values()메서드는 Map 의 모든 값에 대한 Collection 뷰를 반환합니다.Collections.max()는 이 컬렉션에서 최대 요소를 찾습니다.- 그런 다음 Map 을 반복하여 이 최대값과 관련된 키를 찾습니다.
이 접근 방식은 이전 반복적 메서드보다 더 간결하지만 관련 키를 찾기 위해 추가 단계가 필요합니다.
Map 에서 최대 Key 값 찾기
지금까지 Map 에서 최대값을 찾는 데 집중했습니다. 그러나 때로는 대신 최대 키를 찾아야 할 수도 있습니다. 이는 키에 자연스러운 순서가 있고 중요한 의미를 갖는 시나리오에서 일반적입니다.
Map 키와 값 이해
Map 에서:
- 키는 고유 식별자입니다.
- 값은 각 키와 관련된 데이터입니다.
- 키는 Comparable 인터페이스를 구현하는 경우 정렬될 수 있습니다.
- 최대 키를 찾으려면
values()대신keySet()을 사용합니다.
가격을 키로 하는 Map 생성
가격을 키로 하고 코스 이름을 값으로 하는 새로운 예제를 만들어 보겠습니다.
WebIDE 에서
MaxValueInMap.java파일을 엽니다.기존 코드를 다음으로 바꿉니다.
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));
}
}
파일을 저장합니다.
다음 명령으로 프로그램을 실행합니다.
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
이 접근 방식의 주요 차이점
- Map 구조가 반전되었습니다. 이제 가격이 키이고 코스 이름이 값입니다.
- 모든 키를 가져오기 위해
values()대신keySet()을 사용합니다. get(maxPrice)를 사용하여 해당 값을 직접 액세스할 수 있습니다.Collections.min()을 사용하여 최소 가격을 찾는 예제도 추가했습니다.
이 접근 방식은 비교하려는 숫자 값이 이미 Map 에서 키로 사용되고 있는 경우 유용합니다.
요약
이 랩에서는 Java Map 에서 최대값을 찾는 여러 가지 방법을 배웠습니다.
반복적 접근 방식 (Iterative Approach): 루프를 사용하여 Map 항목을 반복하고 값을 비교합니다.
- 최대값과 관련 키를 모두 제공합니다.
- 모든 Map 구현에서 작동합니다.
- 사용자 지정 비교 로직에 유용합니다.
값에 대한 Collections.max(): 내장된 Collections 유틸리티를 사용하여 최대값을 찾습니다.
- 반복적 접근 방식보다 더 간결한 코드입니다.
- 관련 키를 찾기 위해 추가 단계가 필요합니다.
- 요소의 자연 순서를 사용합니다.
키에 대한 Collections.max(): Map 에서 최대 키를 찾습니다.
- 키에 의미 있는 숫자 값이 있는 경우 유용합니다.
get()을 사용하여 관련 값에 직접 액세스합니다.- 최소값을 찾기 위해 Collections.min() 과 함께 사용할 수도 있습니다.
이러한 기술은 데이터 컬렉션에서 극단적인 값을 찾는 데이터 처리 애플리케이션, 데이터베이스 결과 처리, 통계 계산 및 기타 많은 프로그래밍 시나리오에서 널리 사용됩니다.
Java 컬렉션으로 계속 작업할 때 키, 값 또는 둘 다 필요한지, 사용자 지정 비교 로직이 필요한지 여부를 포함하여 특정 요구 사항에 따라 선택하는 접근 방식이 달라져야 함을 기억하십시오.



