[Java] Map forEach 활용문 그리고 Comparator

devdo·2021년 8월 4일
0

Java

목록 보기
17/59
post-thumbnail

개발을 하면서 Map타입을 자주 사용한다. 이번 기회에 정리를 해볼려고 한다. 특히 Data를 넣어서 forEach문으로 돌릴 때를 기준으로 정리하겠다.


간단한 Map 객체를 만들고 key, value 형태에 data를 넣는다.
        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 객체를 전달해야 합니다.



참고

profile
배운 것을 기록합니다.

0개의 댓글