EnumMap으로 카운팅(로또결과)
EnumMap으로 카운팅한 것을 기록
📜 제목으로 보기
EnumMap
Enum List -> EnumMap에 카운팅
-
List<객체>
의 갯수를 객체를 key로 하는 hashMapMap<객체, Integer>
에 세야한다.
빈 Map 선언 및 초기화
-
객체
의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<>();
- EnumMap이라면
일급vs단일 로직
을 먼저 수행한 -> 응답결과List
를 카운팅하는 3가지 방법
-
이제 갯수를 셀
결과값List(Enum List or 객체 List)
들을 돌면서 카운팅한다.-
결과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);
-
결과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개씩 잘 된다.
- 미리 0 초기화 없이
-
결과값(객체key)을 뽑아낼 로직
+ 카운팅
을 동시에 해주는 일급.stream().collect(Collectors.groupingBy(
객체key를 뽑아낼 로직 , summingInt( value -> 1) )
EnumMap은 아니지만, 일급vs단일 –stream–> 단일vs단일 -
결과값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)));
- 결과값List를 미리 뽑지 않는다. ->
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)
));