목표 : 과거 로또 조합과 비교해 중복이면 추천 목록에서 제외하기
해야할 단계
1. 과거 당첨 번호 리스트 Set 형태로 변환(빠른 검색 위해)
2. 랜덤으로 만든 후보 번호 정렬 후 문자열로 변환
3. 과거 set 에 있는지 확인, 있으면 스킵 없으면 저장
for(타입 변수명 : 컬렉션){}
-> 컬렉션(list, array 등)에서 요소를 꺼내서 변수명에 담고 반복한다
for(LottoResult result : lottoData){}
-> lottoData에 있는 값을 하나씩 꺼내서 result에 담고 반복한다
왜 굳이 result 같은 변수에 담고 반복하지?
-> 변수에 담지 않으면 그 값을 사용할 수 없음
향상된 for 문은 자동으로 하나씩 꺼내고 그걸 변수에 저장해서 써야함
- 과거 당첨 번호 조합을 문자열 Set으로 변환
Set pastResultsSet = new HashSet<>();
for (LottoResult result : lottoData) {
int[] numbers = result.getNumberOfRound();
Arrays.sort(numbers);
String key = convertToKey(numbers);
pastResultsSet.add(key);
}
- 추천 번호 조합 생성 후 중복 검사
String key = convertToKey(candidate);
if (!pastResultsSet.contains(key) && isValidCombination(candidate, ratioOption)) {
Arrays.sort(candidate); // 보기 좋게 정렬
recommendations.add(candidate);
}
- 보조 메서드 - 번호 배열을 문자열 키로 바꾸는 함수
private String convertToKey(int[] nums) {
Arrays.sort(nums);
return Arrays.stream(nums)
.mapToObj(String::valueOf)
.collect(Collectors.joining(","));
}
candidate: 후보 추천 번호
if (!pastResultsSet.contains(key) && isValidCombination(candidate, ratioOption))
-> pastResultsSet에 key가 없어야하고 isValidCombination(candidate, ratioOption)도 되어야함