개발을 하면서 Map타입을 자주 사용한다. 이번 기회에 정리를 해볼려고 한다. 특히 Data를 넣어서 forEach문으로 돌릴 때를 기준으로 정리하겠다.
Map<String, Object> pmap = new HashMap<>();
pmap.put("1", "dsg");
pmap.put("2", "kmb");
pmap.put("3", "lbk");
System.out.println("pmap: "+ pmap);
forEach문 형태 각 형태들 예시
1. KeySet
for (String key : pmap.keySet()) {
System.out.println(pmap.get(key)); // value
}
for (String key : pmap.keySet()) {
System.out.println(key); // key
}
2. value
for(Object value:pmap.values()){
System.out.println(value);
}
3. entrySet
System.out.println("enrtySet은 k=v형태 모두 가지고 있다.");
for (Entry<String, Object> val : pmap.entrySet()) {
System.out.println("val: "+val.getValue()+", key: "+val.getKey());
}
4. forEach문 메서드
System.out.println("5======forEach메서드(최신)============");
// value 추출
pmap.entrySet() // k=v
.stream()
.map(Entry::getValue)
.forEach(System.out::println);
System.out.println("=====================");
pmap.keySet()
.forEach(System.out::println);
System.out.println("====================");
pmap.values()
.forEach(System.out::println);
정리하면,
Map -> forEach -> keySet, value ,entrySet(k=v)을 잘 활용하면 된다.
stream()에서 많이 보던 forEach문을 Map 객체에서도 할 수 있다.
Iterators는
자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 인터페이스 로 요즘엔 람다로 사용하는 것으로 대체되었다.
최빈수 구할 떼 entrySet 으로 key, value 모두 추출하기
그러기 위해서 Comparator로 구한다.
String [] alpa = {"a", "b", "b", "b", "c", "c", "d"};
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < alpa.length; i++) {
map.put(alpa[i], map.getOrDefault(alpa[i], 0) + 1);
}
// 단순 최빈수 값 축출
Integer max = Collections.max(map.values());
System.out.println(max);
// key값까지 확인할려면?
// Comparator 재정의
Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
};
Map.Entry<String, Integer> maxEntry = Collections.max(map.entrySet(), comparator);
System.out.println(maxEntry.getKey() + ":" + maxEntry.getValue());
풀이
Comparator<Entry<String, Integer>> comparator = new....
위 코드에서는 먼저 Comparator 객체를 생성하였습니다.
위 Comparator 객체는 compare() 메소드를 Override하여,
Map.Entry 객체의 value 값을 비교하여,
e1.getValue()값이 e2.getValue()보다 크면 양수
를,
e1.getValue()값이 e2.getValue()보다 작으면 음수
를,
같으면 0
을 리턴합니다.
Collections.max(map.entrySet(), comparator);
Collections.mix(map.entrySet(), comparator);
Collections.max(), Collections.min() 메소드를 호출하면서
첫번째 파라미터로 Entry들의 Set을 전달하고,
두번째 파라미터로 앞에서 생성한 comparator 객체를 전달해야 합니다.