📜 제목으로 보기

EnumMap

Enum List -> EnumMap에 카운팅

  • List<객체>의 갯수를 객체를 key로 하는 hashMap Map<객체, Integer> 에 세야한다.
빈 Map 선언 및 초기화
  1. 객체Count을 원한다면 **<객체key, Integer>로 Map을 선언한다. ** (cf) 원시적으로는 직접 0으로 초기화 한다.)

    • EnumMap이라면 ( )생성자에 안에 Enum클래스.class(클래스 자체)를 지정해준다.
     final EnumMap<Rank, Integer> result = new EnumMap<>(Rank.class);
    
    • 참고)

      • (원시적) 모든 객체key들 stream화해서 돌면서 -> forEach -> map.put(객체key, 0)으로 초기화해준다.

          private final EnumMap<Rank, Integer> result = new EnumMap<>(Rank.class);
                    
          {
              Arrays.stream(Rank.values()).forEach(rank -> result.put(rank, 0));
          }
        
    • EnumMap는 넣고난 뒤, 자동정렬되어있지만

      • 일반map넣고 난 뒤, key순으로 정렬되어야하면(순서가 중요하면) hashMap대신 -> linkedHashMap을 사용한다.
        private final LinkedHashMap<Rank, Integer> value = new LinkedHashMap<>();
      
일급vs단일 로직을 먼저 수행한 -> 응답결과List를 카운팅하는 3가지 방법
  1. 이제 갯수를 셀 결과값List(Enum List or 객체 List)들을 돌면서 카운팅한다.

    1. 결과List(객체List)를 먼저 계산 -> 돌면서 ->

      • 이미 0으로 초기화해놓고 넣어놨어야한다.
      • map.put( 객체Key, map.get( 객체key )의 value + 1 )
       {
           Arrays.stream(Rank.values()).forEach(rank -> result.put(rank, 0));
       }
      
       result.put(rankPrize, result.getOrDefault(rankPrize, 0) + 1);
      
    2. 결과List(객체List)를 먼저 계산 -> 돌면서 ->

      • 미리 0 초기화 없이 알아서 직전value(없으면 0부터) 누적해주는 -> map.merge( 객체key, 누적해넣을값, Integer.sum()으로 기존value와 누적방법 Bifunction )
       result.merge(rank, 1, (before, after) -> Integer.sum(before, after))
      
       final List<Rank> results = lottos.stream()
           .map(lotto -> match(lotto, winningLotto))
           .collect(Collectors.toList());
              
       final EnumMap<Rank, Integer> result = new EnumMap<>(Rank.class);
              
       results
           .forEach(rank -> result.merge(rank, 1, (before, after) -> Integer.sum(before, after)));
      
      • 결과값을 찍어보니 merge로 카운팅이 1개씩 잘 된다. image-20220310150556475
EnumMap은 아니지만, 일급vs단일 –stream–> 단일vs단일 결과값(객체key)을 뽑아낼 로직 + 카운팅을 동시에 해주는 일급.stream().collect(Collectors.groupingBy( 객체key를 뽑아낼 로직 , summingInt( value -> 1) )
  1. 결과값List를 뽑는 로직 조차 일급.stream -> 단일vs단일로 객체Key뽑기로직이 내부에 포함됨

    • 결과값List를 미리 뽑지 않는다. -> Collectors.groupingBy( , )의 **첫번째 인자에 **
     // (1)결과값 List를 미리 뽑는 과정 -> 생략됨.
     //final List<Rank> results = lottos.stream()
     //    .map(lotto -> match(lotto, winningLotto))
     //    .collect(Collectors.toList());
        
     // (2) map을 미리 선언해두기 -> 생략됨
     //final EnumMap<Rank, Integer> result = new EnumMap<>(Rank.class);
        
     // (3) 결과값List를 돌면서 -> merge로 1씩 카운팅 -> 생략됨
     //results.stream()
     //    .forEach(rank -> result.merge(rank, 1, (before, after) -> Integer.sum(before, after)));
        
     // 일급을 돌면서 -> groupingBy(단일vs단일의 [결과값 = 객체key]를 뽑는 로직 , 1씩 누적합하는 로직)
     return lottos.stream()
         .collect(Collectors.groupingBy(
             lotto -> match(lotto, winningLotto),
             Collectors.summingInt(value -> 1)));
        
    
groupingBy의 가운데 인자에 EnumMap.class를 줄 수 있다.
final EnumMap<GameResult, Integer> dealerResult = gamblers.stream()
    .collect(Collectors.groupingBy(
        gambler -> getResultPlayer(dealer, gamblerResult, gambler),
        () -> new EnumMap<>(GameResult.class), // Map타입 가운데서 지정
        Collectors.summingInt(count -> 1)
    ));