From b18373321266b035934eed302053ac34a692c618 Mon Sep 17 00:00:00 2001 From: 1nteger Date: Thu, 27 Jun 2019 19:33:21 +0900 Subject: [PATCH 01/20] =?UTF-8?q?[step4]=20feat=20:=20step4=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/LottoApplication.java | 29 ++++++ src/main/java/step4/domain/LottoBalls.java | 17 ++++ src/main/java/step4/domain/LottoNumber.java | 47 +++++++++ src/main/java/step4/domain/LottoRank.java | 43 ++++++++ src/main/java/step4/domain/LottoSeller.java | 37 +++++++ src/main/java/step4/domain/LottoTicket.java | 71 +++++++++++++ .../step4/domain/LottoTicketGenerator.java | 31 ++++++ src/main/java/step4/domain/ResultSheet.java | 60 +++++++++++ src/main/java/step4/view/InputView.java | 39 ++++++++ src/main/java/step4/view/OutputView.java | 49 +++++++++ .../java/step4/domain/LottoNumberTest.java | 34 +++++++ .../java/step4/domain/LottoSellerTest.java | 99 +++++++++++++++++++ .../domain/LottoTicketGeneratorTest.java | 56 +++++++++++ .../java/step4/domain/LottoTicketTest.java | 49 +++++++++ 14 files changed, 661 insertions(+) create mode 100644 src/main/java/step4/LottoApplication.java create mode 100644 src/main/java/step4/domain/LottoBalls.java create mode 100644 src/main/java/step4/domain/LottoNumber.java create mode 100644 src/main/java/step4/domain/LottoRank.java create mode 100644 src/main/java/step4/domain/LottoSeller.java create mode 100644 src/main/java/step4/domain/LottoTicket.java create mode 100644 src/main/java/step4/domain/LottoTicketGenerator.java create mode 100644 src/main/java/step4/domain/ResultSheet.java create mode 100644 src/main/java/step4/view/InputView.java create mode 100644 src/main/java/step4/view/OutputView.java create mode 100644 src/test/java/step4/domain/LottoNumberTest.java create mode 100644 src/test/java/step4/domain/LottoSellerTest.java create mode 100644 src/test/java/step4/domain/LottoTicketGeneratorTest.java create mode 100644 src/test/java/step4/domain/LottoTicketTest.java diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java new file mode 100644 index 00000000000..9556e74c5e2 --- /dev/null +++ b/src/main/java/step4/LottoApplication.java @@ -0,0 +1,29 @@ +package step4; + +import step4.domain.LottoSeller; +import step4.domain.LottoTicket; +import step4.domain.ResultSheet; +import step4.view.InputView; +import step4.view.OutputView; + +import java.util.List; + +public class LottoApplication { + + public static void main(String[] args) { + final int inputMoney = InputView.askMoneyToInput(); + final int numberOfTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); + + OutputView.printNumberOfTickets(numberOfTicketsToBuy); + + List lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); + OutputView.printLottoTickets(lottoTickets); + + LottoTicket luckyNumber = LottoSeller.getLuckyNumber(InputView.askLuckyNumber()); + int bonusNumber = InputView.askBonusNumber(); + + ResultSheet result = ResultSheet.getResult(lottoTickets, luckyNumber, bonusNumber); + OutputView.printResult(result); + } +} + diff --git a/src/main/java/step4/domain/LottoBalls.java b/src/main/java/step4/domain/LottoBalls.java new file mode 100644 index 00000000000..ab94a510af7 --- /dev/null +++ b/src/main/java/step4/domain/LottoBalls.java @@ -0,0 +1,17 @@ +package step4.domain; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class LottoBalls { + + private static List lottoBalls = IntStream + .rangeClosed(LottoNumber.MINIMUM_LOTTO_NUMBER, LottoNumber.MAXIMUM_LOTTO_NUMBER) + .boxed() + .collect(Collectors.toList()); + + public static List getLottoBalls() { + return lottoBalls; + } +} diff --git a/src/main/java/step4/domain/LottoNumber.java b/src/main/java/step4/domain/LottoNumber.java new file mode 100644 index 00000000000..04a33a9605c --- /dev/null +++ b/src/main/java/step4/domain/LottoNumber.java @@ -0,0 +1,47 @@ +package step4.domain; + +import java.util.Objects; + +public class LottoNumber { + static final String ALERT_OUT_OF_RANGE_OF_LOTTO_NUMBER = "로또번호는 1부터 45까지의 자연수만 가능합니다."; + static final int MINIMUM_LOTTO_NUMBER = 1; + static final int MAXIMUM_LOTTO_NUMBER = 45; + private int number; + + private LottoNumber(int number) { + if (isOutOfRange(number)) { + throw new IllegalArgumentException(ALERT_OUT_OF_RANGE_OF_LOTTO_NUMBER); + } + this.number = number; + } + + public static LottoNumber from(Integer number) { + return new LottoNumber(number); + } + + private boolean isOutOfRange(int number) { + return number < MINIMUM_LOTTO_NUMBER || number > MAXIMUM_LOTTO_NUMBER; + } + + public int getNumber() { + return number; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoNumber that = (LottoNumber) o; + return number == that.number; + } + + @Override + public int hashCode() { + return Objects.hash(number); + } + + @Override + public String toString() { + return number + ""; + } +} diff --git a/src/main/java/step4/domain/LottoRank.java b/src/main/java/step4/domain/LottoRank.java new file mode 100644 index 00000000000..c036081f255 --- /dev/null +++ b/src/main/java/step4/domain/LottoRank.java @@ -0,0 +1,43 @@ +package step4.domain; + +import java.util.Arrays; + +public enum LottoRank { + + FIRST_PLACE(6, 2_000_000_000), + SECOND_PLACE(5, 30_000_000), + THIRD_PLACE(5, 1_500_000), + FOURTH_PLACE(4, 50_000), + FIFTH_PLACE(3, 5_000), + LOSER(0, 0); + + private int numberOfMatchedToLuckyNumber; + private int prizeMoney; + + LottoRank(int numberOfMatchedToLuckyNumber, int prizeMoney) { + this.numberOfMatchedToLuckyNumber = numberOfMatchedToLuckyNumber; + this.prizeMoney = prizeMoney; + } + + public static LottoRank from(int countMatchedNumbers, boolean isMatchedToBonusNumber) { + if ((countMatchedNumbers == SECOND_PLACE.numberOfMatchedToLuckyNumber) && isMatchedToBonusNumber) { + return Arrays.stream(LottoRank.values()) + .filter(lottoRank -> lottoRank.prizeMoney == SECOND_PLACE.prizeMoney) + .findFirst() + .get(); + } + return Arrays.stream(LottoRank.values()) + .filter(lottoRank -> lottoRank.numberOfMatchedToLuckyNumber == countMatchedNumbers) + .findFirst() + .orElse(LOSER); + } + + public int getNumberOfMatchingNumber() { + return numberOfMatchedToLuckyNumber; + } + + public int getPrizeMoney() { + return prizeMoney; + } + +} diff --git a/src/main/java/step4/domain/LottoSeller.java b/src/main/java/step4/domain/LottoSeller.java new file mode 100644 index 00000000000..9c8029c2b19 --- /dev/null +++ b/src/main/java/step4/domain/LottoSeller.java @@ -0,0 +1,37 @@ +package step4.domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class LottoSeller { + static final int PRICE_OF_A_LOTTO_TICKET = 1000; + static final String ALERT_MISSING_MONEY = "돈을 넣어주세요. 로또복권은 한 장당 1000원 입니다."; + + public static int countLottoTickets(int inputMoney) { + validationInputMoney(inputMoney); + return inputMoney / PRICE_OF_A_LOTTO_TICKET; + } + + public static List issueLottoTicket(int numberOfTicketsToBuy) { + List lottoTickets = new ArrayList<>(); + + for (int i = 0; i < numberOfTicketsToBuy; i++) { + lottoTickets.add(LottoTicketGenerator.issue()); + } + return lottoTickets; + } + + public static LottoTicket getLuckyNumber(List inputLuckyNumber) { + List lottoTicket = inputLuckyNumber.stream() + .map(LottoNumber::from) + .collect(Collectors.toList()); + return LottoTicketGenerator.issue(lottoTicket); + } + + private static void validationInputMoney(int inputMoney) { + if (inputMoney < PRICE_OF_A_LOTTO_TICKET) { + throw new IllegalArgumentException(ALERT_MISSING_MONEY); + } + } +} diff --git a/src/main/java/step4/domain/LottoTicket.java b/src/main/java/step4/domain/LottoTicket.java new file mode 100644 index 00000000000..81576930be8 --- /dev/null +++ b/src/main/java/step4/domain/LottoTicket.java @@ -0,0 +1,71 @@ +package step4.domain; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class LottoTicket { + static final String ALERT_NUMBER_OVERLAP = "중복된 로또 번호가 존재합니다."; + static final String AlERT_DIFFERENT_SIZE_OF_NUMBERS = "로또번호의 개수가 6개가 아닙니다."; + + private final List lottoTicket; + + LottoTicket(List lottoTicket) { + validationNumberSize(lottoTicket); + validationNumberOverlap(lottoTicket); + this.lottoTicket = lottoTicket; + } + + public int getNumberOfMatchedToLuckyNumber(LottoTicket luckyNumber) { + return (int) luckyNumber.getLottoTicket().stream() + .filter(lottoTicket::contains) + .count(); + } + + boolean isBonusNumberMatched(int bonusNumber) { + return lottoTicket.stream() + .mapToInt(LottoNumber::getNumber) + .anyMatch(i -> i == bonusNumber); + } + + private void validationNumberSize(List lottoTicket) { + if (lottoTicket.size() != LottoTicketGenerator.BASIC_LOTTO_SIZE) { + throw new IllegalArgumentException(AlERT_DIFFERENT_SIZE_OF_NUMBERS); + } + } + + private void validationNumberOverlap(List lottoTicket) { + long SizeOfLottoTicket = lottoTicket.stream() + .mapToLong(LottoNumber::getNumber) + .distinct() + .count(); + + if (SizeOfLottoTicket != LottoTicketGenerator.BASIC_LOTTO_SIZE) { + throw new IllegalArgumentException(ALERT_NUMBER_OVERLAP); + } + } + + public List getLottoTicket() { + return Collections.unmodifiableList(lottoTicket); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoTicket that = (LottoTicket) o; + return Objects.equals(lottoTicket, that.lottoTicket); + } + + @Override + public int hashCode() { + return Objects.hash(lottoTicket); + } + + @Override + public String toString() { + return "LottoTicket{" + + "lottoTicket=" + lottoTicket + + '}'; + } +} diff --git a/src/main/java/step4/domain/LottoTicketGenerator.java b/src/main/java/step4/domain/LottoTicketGenerator.java new file mode 100644 index 00000000000..134787b3310 --- /dev/null +++ b/src/main/java/step4/domain/LottoTicketGenerator.java @@ -0,0 +1,31 @@ +package step4.domain; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class LottoTicketGenerator { + static final int BASIC_LOTTO_SIZE = 6; + + static LottoTicket issue() { + return new LottoTicket(pickLottoBalls(LottoBalls.getLottoBalls())); + } + + static LottoTicket issue(List lottoTicket) { + return new LottoTicket(lottoTicket); + } + + static List pickLottoBalls(List lottoBalls) { + shuffleLottoBalls(lottoBalls); + return lottoBalls.stream() + .limit(BASIC_LOTTO_SIZE) + .sorted() + .map(LottoNumber::from) + .collect(Collectors.toList()); + } + + static void shuffleLottoBalls(List lottoBalls) { + Collections.shuffle(lottoBalls); + } + +} diff --git a/src/main/java/step4/domain/ResultSheet.java b/src/main/java/step4/domain/ResultSheet.java new file mode 100644 index 00000000000..7dcd4c67e54 --- /dev/null +++ b/src/main/java/step4/domain/ResultSheet.java @@ -0,0 +1,60 @@ +package step4.domain; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ResultSheet { + private static final int LOTTO_TICKET_PRICE = 1000; + + private Map resultSheet; + + private ResultSheet(Map resultSheet) { + this.resultSheet = resultSheet; + } + + public static ResultSheet getResult(List lottoTickets, LottoTicket luckyNumber, int bonusNumber) { + Map lottoResultMap = new HashMap<>(); + + for (LottoTicket ticket : lottoTickets) { + LottoRank lottoRank = LottoRank.from(ticket.getNumberOfMatchedToLuckyNumber(luckyNumber), ticket.isBonusNumberMatched(bonusNumber)); + int numberOfTicketsCorrespondingToRank = lottoResultMap.getOrDefault(lottoRank, 0); + lottoResultMap.put(lottoRank, ++numberOfTicketsCorrespondingToRank); + } + return new ResultSheet(lottoResultMap); + } + + private int getTotalTicketsBought() { + return resultSheet.values() + .stream() + .reduce(Integer::sum) + .get(); + } + + private int totalMoneySpentForTickets() { + return getTotalTicketsBought() * LOTTO_TICKET_PRICE; + } + + private int getNumberOfTicketsCorrespondingToRank(LottoRank lottoRank) { + return resultSheet.getOrDefault(lottoRank, 0); + } + + private int getEachPrizeMoney(LottoRank lottoRank) { + return lottoRank.getPrizeMoney() * this.getNumberOfTicketsCorrespondingToRank(lottoRank); + } + + private int getTotalPrizeMoney() { + return resultSheet.keySet() + .stream() + .mapToInt(this::getEachPrizeMoney) + .sum(); + } + + public double getEarningRate() { + return getTotalPrizeMoney() / totalMoneySpentForTickets(); + } + + public Map getResultMap() { + return resultSheet; + } +} diff --git a/src/main/java/step4/view/InputView.java b/src/main/java/step4/view/InputView.java new file mode 100644 index 00000000000..06fc6baed3f --- /dev/null +++ b/src/main/java/step4/view/InputView.java @@ -0,0 +1,39 @@ +package step4.view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class InputView { + private static final String LUCKY_NUMBER_SEPARATOR = ","; + private static Scanner scanner = new Scanner(System.in); + + public static int askMoneyToInput() { + System.out.println("구입금액을 입력해 주세요."); + return scanner.nextInt(); + } + + public static List askLuckyNumber() { + printBlackLine(); + scanner.nextLine(); + System.out.println("지난 주 당첨 번호를 입력해주세요."); + String inputLuckyNumber = scanner.nextLine(); + printBlackLine(); + + return Arrays.stream(inputLuckyNumber.split(LUCKY_NUMBER_SEPARATOR)) + .map(String::trim) + .mapToInt(Integer::parseInt) + .boxed() + .collect(Collectors.toList()); + } + + public static int askBonusNumber() { + System.out.println("보너스 볼을 입력해 주세요."); + return scanner.nextInt(); + } + + private static void printBlackLine() { + System.out.println(); + } +} diff --git a/src/main/java/step4/view/OutputView.java b/src/main/java/step4/view/OutputView.java new file mode 100644 index 00000000000..a4075671e75 --- /dev/null +++ b/src/main/java/step4/view/OutputView.java @@ -0,0 +1,49 @@ +package step4.view; + +import step4.domain.LottoRank; +import step4.domain.LottoTicket; +import step4.domain.ResultSheet; + +import java.util.List; + +public class OutputView { + private static final String MESSAGE_FOR_EARNING_RATE = "총 수익률은 %.2f 입니다."; + private static final String MESSAGE_FOR_LOTTO_RESULT = "%d개 일치 (%d원) - %d개"; + private static final int PRIZE_FOR_LOSER = 0; + private static final String MESSAGE_FOR_ONLY_SECOND_PLACE = "%d개 일치, 보너스 볼 일치 (%d원) - %d개"; + private static final int SECOND_PLACE_PRIZE = 30_000_000; + + public static void printNumberOfTickets(int numberOfLottoTicketsToBuy) { + System.out.println(numberOfLottoTicketsToBuy + "개를 구매했습니다."); + } + + public static void printLottoTickets(List lottoTickets) { + lottoTickets.stream() + .map(LottoTicket::getLottoTicket) + .forEach(System.out::println); + } + + public static void printResult(ResultSheet result) { + System.out.println("당첨 통계"); + System.out.println("---------"); + + for (LottoRank rank : LottoRank.values()) { + if (rank.getPrizeMoney() == SECOND_PLACE_PRIZE) { + printResultContent(result, rank, MESSAGE_FOR_ONLY_SECOND_PLACE); + } + if (rank.getPrizeMoney() != SECOND_PLACE_PRIZE) { + printResultContent(result, rank, MESSAGE_FOR_LOTTO_RESULT); + } + //TODO: Q. else 구문을 안쓰면서도 이 부분을 어떻게 개선할 수 있을지 궁금합니다..! + } + System.out.println(String.format(MESSAGE_FOR_EARNING_RATE, result.getEarningRate())); + } + + private static void printResultContent(ResultSheet result, LottoRank rank, String messageFormat) { + System.out.println(String.format(messageFormat, + rank.getNumberOfMatchingNumber(), + rank.getPrizeMoney(), + result.getResultMap().getOrDefault(rank, PRIZE_FOR_LOSER))); + } + +} diff --git a/src/test/java/step4/domain/LottoNumberTest.java b/src/test/java/step4/domain/LottoNumberTest.java new file mode 100644 index 00000000000..266075cb620 --- /dev/null +++ b/src/test/java/step4/domain/LottoNumberTest.java @@ -0,0 +1,34 @@ +package step4.domain; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import step3.domain.LottoNumber; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class LottoNumberTest { + @Test + void 로또번호_객체를_생성한다() { + //Given + int randomNumber = 39; + LottoNumber lottoNumber = LottoNumber.from(randomNumber); + + //When + //Then + assertThat(lottoNumber.getNumber()).isEqualTo(39); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 0, 46}) + void 로또번호가_1보다_작고_45_보다_크면_예외가_발생한다(int num) { + //Given + //When + //Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> { + LottoNumber.from(num); + }).withMessageContaining(LottoNumber.ALERT_OUT_OF_RANGE_OF_LOTTO_NUMBER); + } +} diff --git a/src/test/java/step4/domain/LottoSellerTest.java b/src/test/java/step4/domain/LottoSellerTest.java new file mode 100644 index 00000000000..b2ce6c11734 --- /dev/null +++ b/src/test/java/step4/domain/LottoSellerTest.java @@ -0,0 +1,99 @@ +package step4.domain; + +import org.junit.jupiter.api.Test; +import step3.domain.LottoRank; +import step3.domain.LottoSeller; +import step3.domain.LottoTicket; +import step3.domain.LottoTicketGenerator; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class LottoSellerTest { + @Test + void 입력받은_금액에_따라_구입하는_로또복권의_개수를_반환한다() { + //Given + int inputMoney = 14000; + + //When + int lottoTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); + + //Then + assertThat(lottoTicketsToBuy).isEqualTo(inputMoney/LottoSeller.PRICE_OF_A_LOTTO_TICKET); + } + + @Test + void 입력받은_금액이_로또복권_한_장_가격보다_낮을_경우_예외가_발생한다() { + //Given + int inputInsufficientMoney = 900; + int inputNegativeNumber = -1; + + //When + //Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> { + LottoSeller.countLottoTickets(inputInsufficientMoney); + LottoSeller.countLottoTickets(inputNegativeNumber); + }).withMessage(LottoSeller.ALERT_MISSING_MONEY); + } + + @Test + void 구입할_개수만큼_로또복권을_발행한다() { + //Given + int inputMoney = 14000; + int numberOfTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); + + //When + List lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); + + //Then + assertThat(lottoTickets.size()).isEqualTo(numberOfTicketsToBuy); + } + + @Test + void 당첨번호와_일치한_번호_개수를_반환한다() { + //Given + List testLuckyNumber = Arrays.asList(1, 2, 3, 4, 5, 6); + LottoTicket luckyNumber =LottoSeller.getLuckyNumber(testLuckyNumber); + + List matchesThreeNumbers = Arrays.asList(1, 3, 5, 7, 9, 11); + LottoTicket ticketMatchesThreeNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(matchesThreeNumbers)); + + //When + long result = ticketMatchesThreeNumbers.getNumberOfMatchedToLuckyNumber(luckyNumber); + + //Then + assertThat(result).isEqualTo(3); + } + + @Test + void 당첨통계를_반환한다() { + //Given + List testLuckyNumber = Arrays.asList(1, 2, 3, 4, 5, 6); + LottoTicket luckyNumber =LottoSeller.getLuckyNumber(testLuckyNumber); + + List matchesFourNumbers = Arrays.asList(1, 2, 3, 4, 7, 8); + List matchesFiveNumbers = Arrays.asList(1, 2, 3, 4, 5, 8); + LottoTicket ticketMatchesFourNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(matchesFourNumbers)); + LottoTicket ticketMatchesFiveNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(matchesFiveNumbers)); + LottoTicket ticketMatchesSixNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(testLuckyNumber)); + + List lottoTickets = new ArrayList<>(); + lottoTickets.add(ticketMatchesFourNumbers); + lottoTickets.add(ticketMatchesFiveNumbers); + lottoTickets.add(ticketMatchesSixNumbers); + + //When + Map> resultMap = LottoSeller.getLottoResult(lottoTickets, luckyNumber); + + //Then + assertThat(resultMap.get(LottoRank.FIRST_PLACE).get(0)).isEqualTo(ticketMatchesSixNumbers); + assertThat(resultMap.get(LottoRank.SECOND_PLACE).get(0)).isEqualTo(ticketMatchesFiveNumbers); + assertThat(resultMap.get(LottoRank.THIRD_PLACE).get(0)).isEqualTo(ticketMatchesFourNumbers); + } +} diff --git a/src/test/java/step4/domain/LottoTicketGeneratorTest.java b/src/test/java/step4/domain/LottoTicketGeneratorTest.java new file mode 100644 index 00000000000..ab9817ffc5e --- /dev/null +++ b/src/test/java/step4/domain/LottoTicketGeneratorTest.java @@ -0,0 +1,56 @@ +package step4.domain; + +import org.junit.jupiter.api.Test; +import step3.domain.LottoBalls; +import step3.domain.LottoNumber; +import step3.domain.LottoTicket; +import step3.domain.LottoTicketGenerator; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoTicketGeneratorTest { + @Test + void 로또복권을_생성한다() { + //Given + LottoTicket lottoTicket = LottoTicketGenerator.issue(); + //When + //Then + assertThat(lottoTicket.getLottoTicket().size()).isEqualTo(LottoTicketGenerator.BASIC_LOTTO_SIZE); + } + + @Test + void 로또번호_1부터_45까지를_생성하여_리스트에_담는다() { + //Given + List lottoBalls = LottoBalls.getLottoBalls(); + + //When + //Then + assertThat(lottoBalls.size()).isEqualTo(LottoNumber.MAXIMUM_LOTTO_NUMBER); + } + + @Test + void 로또번호가_담긴_리스트로부터_6개의_숫자를_추출하여_리스트에_담는다() { + //Given + List lottoBalls = LottoBalls.getLottoBalls(); + + //When + List lotto = LottoTicketGenerator.pickLottoBalls(lottoBalls); + + //Then + assertThat(lotto.size()).isEqualTo(LottoTicketGenerator.BASIC_LOTTO_SIZE); + } + + @Test + void 추출된_6개의_숫자를_오름차순으로_정렬한다() { + //Given + List lottoBalls = LottoBalls.getLottoBalls(); + + //When + List lotto = LottoTicketGenerator.pickLottoBalls(lottoBalls); + + //Then + assertThat(lotto.get(LottoTicketGenerator.BASIC_LOTTO_SIZE - 1).getNumber()).isGreaterThan(lotto.get(0).getNumber()); + } +} diff --git a/src/test/java/step4/domain/LottoTicketTest.java b/src/test/java/step4/domain/LottoTicketTest.java new file mode 100644 index 00000000000..d37e6d4488e --- /dev/null +++ b/src/test/java/step4/domain/LottoTicketTest.java @@ -0,0 +1,49 @@ +package step4.domain; + +import org.junit.jupiter.api.Test; +import step3.domain.LottoNumber; +import step3.domain.LottoTicket; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class LottoTicketTest { + + @Test + void 로또복권의_로또번호가_중복될_경우_예외가_발생한다() { + //Given + List overlapNumbers = Arrays.asList(1, 1, 3, 4, 5, 6); + + //When + //Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> { + new LottoTicket(overlapNumbers + .stream() + .map(LottoNumber::from) + .collect(Collectors.toList())); + }).withMessageContaining(LottoTicket.ALERT_NUMBER_OVERLAP); + } + + @Test + void 로또복권의_로또번호가_6개보다_작거나_클_경우_예외가_발생한다() { + //Given + List lackOfNumbers = Arrays.asList(1, 2, 3, 4, 5); + List excessOfNumbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + + //When + //Then + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> { + new LottoTicket(lackOfNumbers.stream() + .map(LottoNumber::from) + .collect(Collectors.toList())); + new LottoTicket(excessOfNumbers.stream() + .map(LottoNumber::from) + .collect(Collectors.toList())); + }).withMessageContaining(LottoTicket.AlERT_DIFFERENT_SIZE_OF_NUMBERS); + } +} From 3113b8aa681e05ca3d9c4c672caff982806d24ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 09:13:58 +0900 Subject: [PATCH 02/20] =?UTF-8?q?[step4]=20refactor=20:=20LottoTickets=20?= =?UTF-8?q?=EC=9D=BC=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/domain/LottoTickets.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/step4/domain/LottoTickets.java diff --git a/src/main/java/step4/domain/LottoTickets.java b/src/main/java/step4/domain/LottoTickets.java new file mode 100644 index 00000000000..61b0777a7f3 --- /dev/null +++ b/src/main/java/step4/domain/LottoTickets.java @@ -0,0 +1,15 @@ +package step4.domain; + +import java.util.List; + +public class LottoTickets { + private final List lottoTickets; + + public LottoTickets(List lottoTickets) { + this.lottoTickets = lottoTickets; + } + + public static LottoTickets from(List lottoTickets) { + return new LottoTickets(lottoTickets); + } +} From ea39369c0242ee14463d7af71c57c16ab593a06e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 09:27:05 +0900 Subject: [PATCH 03/20] =?UTF-8?q?[step4]=20refactor=20:=20List=20=EC=82=AC=EC=9A=A9=EB=90=98=EB=8D=98=20=EA=B3=B3=EC=9D=84?= =?UTF-8?q?=20LottoTickets=EB=A1=9C=20=EB=B3=80=EA=B2=BD(=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/LottoApplication.java | 3 ++- src/main/java/step4/domain/LottoSeller.java | 4 ++-- src/main/java/step4/domain/LottoTickets.java | 7 ++++++- src/main/java/step4/domain/ResultSheet.java | 4 ++-- src/main/java/step4/view/OutputView.java | 5 +++-- src/test/java/step4/domain/LottoNumberTest.java | 1 - src/test/java/step4/domain/LottoSellerTest.java | 10 +++------- .../java/step4/domain/LottoTicketGeneratorTest.java | 4 ---- src/test/java/step4/domain/LottoTicketTest.java | 2 -- 9 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java index 9556e74c5e2..f1a3fd39e1c 100644 --- a/src/main/java/step4/LottoApplication.java +++ b/src/main/java/step4/LottoApplication.java @@ -2,6 +2,7 @@ import step4.domain.LottoSeller; import step4.domain.LottoTicket; +import step4.domain.LottoTickets; import step4.domain.ResultSheet; import step4.view.InputView; import step4.view.OutputView; @@ -16,7 +17,7 @@ public static void main(String[] args) { OutputView.printNumberOfTickets(numberOfTicketsToBuy); - List lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); + LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); OutputView.printLottoTickets(lottoTickets); LottoTicket luckyNumber = LottoSeller.getLuckyNumber(InputView.askLuckyNumber()); diff --git a/src/main/java/step4/domain/LottoSeller.java b/src/main/java/step4/domain/LottoSeller.java index 9c8029c2b19..34d72ce4e72 100644 --- a/src/main/java/step4/domain/LottoSeller.java +++ b/src/main/java/step4/domain/LottoSeller.java @@ -13,13 +13,13 @@ public static int countLottoTickets(int inputMoney) { return inputMoney / PRICE_OF_A_LOTTO_TICKET; } - public static List issueLottoTicket(int numberOfTicketsToBuy) { + public static LottoTickets issueLottoTicket(int numberOfTicketsToBuy) { List lottoTickets = new ArrayList<>(); for (int i = 0; i < numberOfTicketsToBuy; i++) { lottoTickets.add(LottoTicketGenerator.issue()); } - return lottoTickets; + return LottoTickets.from(lottoTickets); } public static LottoTicket getLuckyNumber(List inputLuckyNumber) { diff --git a/src/main/java/step4/domain/LottoTickets.java b/src/main/java/step4/domain/LottoTickets.java index 61b0777a7f3..04c22756942 100644 --- a/src/main/java/step4/domain/LottoTickets.java +++ b/src/main/java/step4/domain/LottoTickets.java @@ -1,15 +1,20 @@ package step4.domain; +import java.util.Collections; import java.util.List; public class LottoTickets { private final List lottoTickets; - public LottoTickets(List lottoTickets) { + private LottoTickets(List lottoTickets) { this.lottoTickets = lottoTickets; } public static LottoTickets from(List lottoTickets) { return new LottoTickets(lottoTickets); } + + public List getLottoTickets() { + return Collections.unmodifiableList(lottoTickets); + } } diff --git a/src/main/java/step4/domain/ResultSheet.java b/src/main/java/step4/domain/ResultSheet.java index 7dcd4c67e54..41f2f476657 100644 --- a/src/main/java/step4/domain/ResultSheet.java +++ b/src/main/java/step4/domain/ResultSheet.java @@ -13,10 +13,10 @@ private ResultSheet(Map resultSheet) { this.resultSheet = resultSheet; } - public static ResultSheet getResult(List lottoTickets, LottoTicket luckyNumber, int bonusNumber) { + public static ResultSheet getResult(LottoTickets lottoTickets, LottoTicket luckyNumber, int bonusNumber) { Map lottoResultMap = new HashMap<>(); - for (LottoTicket ticket : lottoTickets) { + for (LottoTicket ticket : lottoTickets.getLottoTickets()) { LottoRank lottoRank = LottoRank.from(ticket.getNumberOfMatchedToLuckyNumber(luckyNumber), ticket.isBonusNumberMatched(bonusNumber)); int numberOfTicketsCorrespondingToRank = lottoResultMap.getOrDefault(lottoRank, 0); lottoResultMap.put(lottoRank, ++numberOfTicketsCorrespondingToRank); diff --git a/src/main/java/step4/view/OutputView.java b/src/main/java/step4/view/OutputView.java index a4075671e75..041990e325a 100644 --- a/src/main/java/step4/view/OutputView.java +++ b/src/main/java/step4/view/OutputView.java @@ -2,6 +2,7 @@ import step4.domain.LottoRank; import step4.domain.LottoTicket; +import step4.domain.LottoTickets; import step4.domain.ResultSheet; import java.util.List; @@ -17,8 +18,8 @@ public static void printNumberOfTickets(int numberOfLottoTicketsToBuy) { System.out.println(numberOfLottoTicketsToBuy + "개를 구매했습니다."); } - public static void printLottoTickets(List lottoTickets) { - lottoTickets.stream() + public static void printLottoTickets(LottoTickets lottoTickets) { + lottoTickets.getLottoTickets().stream() .map(LottoTicket::getLottoTicket) .forEach(System.out::println); } diff --git a/src/test/java/step4/domain/LottoNumberTest.java b/src/test/java/step4/domain/LottoNumberTest.java index 266075cb620..72a60a90649 100644 --- a/src/test/java/step4/domain/LottoNumberTest.java +++ b/src/test/java/step4/domain/LottoNumberTest.java @@ -3,7 +3,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import step3.domain.LottoNumber; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/src/test/java/step4/domain/LottoSellerTest.java b/src/test/java/step4/domain/LottoSellerTest.java index b2ce6c11734..1e7efa994ec 100644 --- a/src/test/java/step4/domain/LottoSellerTest.java +++ b/src/test/java/step4/domain/LottoSellerTest.java @@ -1,10 +1,6 @@ package step4.domain; import org.junit.jupiter.api.Test; -import step3.domain.LottoRank; -import step3.domain.LottoSeller; -import step3.domain.LottoTicket; -import step3.domain.LottoTicketGenerator; import java.util.ArrayList; import java.util.Arrays; @@ -24,7 +20,7 @@ public class LottoSellerTest { int lottoTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); //Then - assertThat(lottoTicketsToBuy).isEqualTo(inputMoney/LottoSeller.PRICE_OF_A_LOTTO_TICKET); + assertThat(lottoTicketsToBuy).isEqualTo(inputMoney / LottoSeller.PRICE_OF_A_LOTTO_TICKET); } @Test @@ -59,7 +55,7 @@ public class LottoSellerTest { void 당첨번호와_일치한_번호_개수를_반환한다() { //Given List testLuckyNumber = Arrays.asList(1, 2, 3, 4, 5, 6); - LottoTicket luckyNumber =LottoSeller.getLuckyNumber(testLuckyNumber); + LottoTicket luckyNumber = LottoSeller.getLuckyNumber(testLuckyNumber); List matchesThreeNumbers = Arrays.asList(1, 3, 5, 7, 9, 11); LottoTicket ticketMatchesThreeNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(matchesThreeNumbers)); @@ -75,7 +71,7 @@ public class LottoSellerTest { void 당첨통계를_반환한다() { //Given List testLuckyNumber = Arrays.asList(1, 2, 3, 4, 5, 6); - LottoTicket luckyNumber =LottoSeller.getLuckyNumber(testLuckyNumber); + LottoTicket luckyNumber = LottoSeller.getLuckyNumber(testLuckyNumber); List matchesFourNumbers = Arrays.asList(1, 2, 3, 4, 7, 8); List matchesFiveNumbers = Arrays.asList(1, 2, 3, 4, 5, 8); diff --git a/src/test/java/step4/domain/LottoTicketGeneratorTest.java b/src/test/java/step4/domain/LottoTicketGeneratorTest.java index ab9817ffc5e..b3c20d94e38 100644 --- a/src/test/java/step4/domain/LottoTicketGeneratorTest.java +++ b/src/test/java/step4/domain/LottoTicketGeneratorTest.java @@ -1,10 +1,6 @@ package step4.domain; import org.junit.jupiter.api.Test; -import step3.domain.LottoBalls; -import step3.domain.LottoNumber; -import step3.domain.LottoTicket; -import step3.domain.LottoTicketGenerator; import java.util.List; diff --git a/src/test/java/step4/domain/LottoTicketTest.java b/src/test/java/step4/domain/LottoTicketTest.java index d37e6d4488e..a5147776d91 100644 --- a/src/test/java/step4/domain/LottoTicketTest.java +++ b/src/test/java/step4/domain/LottoTicketTest.java @@ -1,8 +1,6 @@ package step4.domain; import org.junit.jupiter.api.Test; -import step3.domain.LottoNumber; -import step3.domain.LottoTicket; import java.util.Arrays; import java.util.List; From dace932241a276a3a5a3d4009c1eb4b71929b90c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 09:35:48 +0900 Subject: [PATCH 04/20] =?UTF-8?q?[step4]=20refactor=20:=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=98=81=EC=97=AD=20=EB=82=B4=EC=97=90?= =?UTF-8?q?=EC=84=9C=20int=20bonusNumber=EB=A5=BCLottoNumber=20=EB=B6=88?= =?UTF-8?q?=EB=B3=80=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=EC=A3=BC=EA=B3=A0=20?= =?UTF-8?q?=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/domain/LottoTicket.java | 9 +++++---- src/main/java/step4/domain/ResultSheet.java | 4 +++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/step4/domain/LottoTicket.java b/src/main/java/step4/domain/LottoTicket.java index 81576930be8..42d827393c6 100644 --- a/src/main/java/step4/domain/LottoTicket.java +++ b/src/main/java/step4/domain/LottoTicket.java @@ -22,10 +22,11 @@ public int getNumberOfMatchedToLuckyNumber(LottoTicket luckyNumber) { .count(); } - boolean isBonusNumberMatched(int bonusNumber) { - return lottoTicket.stream() - .mapToInt(LottoNumber::getNumber) - .anyMatch(i -> i == bonusNumber); + boolean isBonusNumberMatched(LottoNumber bonusNumber) { +// return lottoTicket.stream() +// .mapToInt(LottoNumber::getNumber) +// .anyMatch(i -> i == bonusNumber); + return lottoTicket.contains(bonusNumber); } private void validationNumberSize(List lottoTicket) { diff --git a/src/main/java/step4/domain/ResultSheet.java b/src/main/java/step4/domain/ResultSheet.java index 41f2f476657..ca08f9177cf 100644 --- a/src/main/java/step4/domain/ResultSheet.java +++ b/src/main/java/step4/domain/ResultSheet.java @@ -17,7 +17,9 @@ public static ResultSheet getResult(LottoTickets lottoTickets, LottoTicket lucky Map lottoResultMap = new HashMap<>(); for (LottoTicket ticket : lottoTickets.getLottoTickets()) { - LottoRank lottoRank = LottoRank.from(ticket.getNumberOfMatchedToLuckyNumber(luckyNumber), ticket.isBonusNumberMatched(bonusNumber)); + LottoRank lottoRank = LottoRank.from( + ticket.getNumberOfMatchedToLuckyNumber(luckyNumber), + ticket.isBonusNumberMatched(LottoNumber.from(bonusNumber))); int numberOfTicketsCorrespondingToRank = lottoResultMap.getOrDefault(lottoRank, 0); lottoResultMap.put(lottoRank, ++numberOfTicketsCorrespondingToRank); } From 571046a38045916676b6d420986061b4360bc149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 09:46:43 +0900 Subject: [PATCH 05/20] =?UTF-8?q?[step4]=20refactor=20:=20=EB=8B=B9?= =?UTF-8?q?=EC=B2=A8=ED=8B=B0=EC=BC=93=EA=B3=BC=20=EB=B3=B4=EB=84=88?= =?UTF-8?q?=EC=8A=A4=EB=B2=88=ED=98=B8=EB=A5=BC=20=EB=8B=B4=EB=8A=94=20Luc?= =?UTF-8?q?kyTicket=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/domain/LottoTicket.java | 3 --- src/main/java/step4/domain/LuckyTicket.java | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 src/main/java/step4/domain/LuckyTicket.java diff --git a/src/main/java/step4/domain/LottoTicket.java b/src/main/java/step4/domain/LottoTicket.java index 42d827393c6..8c981937a3a 100644 --- a/src/main/java/step4/domain/LottoTicket.java +++ b/src/main/java/step4/domain/LottoTicket.java @@ -23,9 +23,6 @@ public int getNumberOfMatchedToLuckyNumber(LottoTicket luckyNumber) { } boolean isBonusNumberMatched(LottoNumber bonusNumber) { -// return lottoTicket.stream() -// .mapToInt(LottoNumber::getNumber) -// .anyMatch(i -> i == bonusNumber); return lottoTicket.contains(bonusNumber); } diff --git a/src/main/java/step4/domain/LuckyTicket.java b/src/main/java/step4/domain/LuckyTicket.java new file mode 100644 index 00000000000..242b00ec19c --- /dev/null +++ b/src/main/java/step4/domain/LuckyTicket.java @@ -0,0 +1,15 @@ +package step4.domain; + +public class LuckyTicket { + private final LottoTicket luckyTicket; + private final LottoNumber bonusNumber; + + public LuckyTicket(LottoTicket luckyTicket, LottoNumber bonusNumber) { + this.luckyTicket = luckyTicket; + this.bonusNumber = bonusNumber; + } + + public static LuckyTicket of(LottoTicket luckyTicket, LottoNumber bonusNumber) { + return new LuckyTicket(luckyTicket, bonusNumber); + } +} From 94f93a4fd0626c1abaa7d9582abd1ed84a3d4d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 10:27:29 +0900 Subject: [PATCH 06/20] =?UTF-8?q?[step4]=20refactor=20:=20lottoTicket?= =?UTF-8?q?=EA=B3=BC=20bonusNumber=EB=A5=BC=20=EC=9D=B8=EC=9E=90=EB=A1=9C?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8D=98=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=EC=9D=84=20LuckyTicket=EC=9C=BC=EB=A1=9C=20=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/LottoApplication.java | 12 ++++------- src/main/java/step4/domain/LottoSeller.java | 6 +++--- src/main/java/step4/domain/LottoTicket.java | 8 +++---- .../step4/domain/LottoTicketGenerator.java | 4 ---- src/main/java/step4/domain/LuckyTicket.java | 21 ++++++++++++++----- src/main/java/step4/domain/ResultSheet.java | 6 +++--- 6 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java index f1a3fd39e1c..3f07beac94d 100644 --- a/src/main/java/step4/LottoApplication.java +++ b/src/main/java/step4/LottoApplication.java @@ -1,9 +1,6 @@ package step4; -import step4.domain.LottoSeller; -import step4.domain.LottoTicket; -import step4.domain.LottoTickets; -import step4.domain.ResultSheet; +import step4.domain.*; import step4.view.InputView; import step4.view.OutputView; @@ -14,16 +11,15 @@ public class LottoApplication { public static void main(String[] args) { final int inputMoney = InputView.askMoneyToInput(); final int numberOfTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); - OutputView.printNumberOfTickets(numberOfTicketsToBuy); LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); OutputView.printLottoTickets(lottoTickets); - LottoTicket luckyNumber = LottoSeller.getLuckyNumber(InputView.askLuckyNumber()); - int bonusNumber = InputView.askBonusNumber(); + LuckyTicket luckyTicket = LottoSeller + .getLuckyNumber(InputView.askLuckyNumber(), InputView.askBonusNumber()); - ResultSheet result = ResultSheet.getResult(lottoTickets, luckyNumber, bonusNumber); + ResultSheet result = ResultSheet.getResult(lottoTickets, luckyTicket); OutputView.printResult(result); } } diff --git a/src/main/java/step4/domain/LottoSeller.java b/src/main/java/step4/domain/LottoSeller.java index 34d72ce4e72..8ed368e0c4f 100644 --- a/src/main/java/step4/domain/LottoSeller.java +++ b/src/main/java/step4/domain/LottoSeller.java @@ -22,11 +22,11 @@ public static LottoTickets issueLottoTicket(int numberOfTicketsToBuy) { return LottoTickets.from(lottoTickets); } - public static LottoTicket getLuckyNumber(List inputLuckyNumber) { - List lottoTicket = inputLuckyNumber.stream() + public static LuckyTicket getLuckyNumber(List inputLuckyNumber, int bonusNumber) { + List luckyTicket = inputLuckyNumber.stream() .map(LottoNumber::from) .collect(Collectors.toList()); - return LottoTicketGenerator.issue(lottoTicket); + return LuckyTicket.of(luckyTicket, LottoNumber.from(bonusNumber)); } private static void validationInputMoney(int inputMoney) { diff --git a/src/main/java/step4/domain/LottoTicket.java b/src/main/java/step4/domain/LottoTicket.java index 8c981937a3a..0d87a481767 100644 --- a/src/main/java/step4/domain/LottoTicket.java +++ b/src/main/java/step4/domain/LottoTicket.java @@ -16,14 +16,14 @@ public class LottoTicket { this.lottoTicket = lottoTicket; } - public int getNumberOfMatchedToLuckyNumber(LottoTicket luckyNumber) { - return (int) luckyNumber.getLottoTicket().stream() + public int getNumberOfMatchedToLuckyNumber(LuckyTicket luckyTicket) { + return (int) luckyTicket.getLuckyNumber().stream() .filter(lottoTicket::contains) .count(); } - boolean isBonusNumberMatched(LottoNumber bonusNumber) { - return lottoTicket.contains(bonusNumber); + boolean isBonusNumberMatched(LuckyTicket luckyTicket) { + return luckyTicket.checkBonusNumber(lottoTicket); } private void validationNumberSize(List lottoTicket) { diff --git a/src/main/java/step4/domain/LottoTicketGenerator.java b/src/main/java/step4/domain/LottoTicketGenerator.java index 134787b3310..15b0d218077 100644 --- a/src/main/java/step4/domain/LottoTicketGenerator.java +++ b/src/main/java/step4/domain/LottoTicketGenerator.java @@ -11,10 +11,6 @@ static LottoTicket issue() { return new LottoTicket(pickLottoBalls(LottoBalls.getLottoBalls())); } - static LottoTicket issue(List lottoTicket) { - return new LottoTicket(lottoTicket); - } - static List pickLottoBalls(List lottoBalls) { shuffleLottoBalls(lottoBalls); return lottoBalls.stream() diff --git a/src/main/java/step4/domain/LuckyTicket.java b/src/main/java/step4/domain/LuckyTicket.java index 242b00ec19c..ed864962fd6 100644 --- a/src/main/java/step4/domain/LuckyTicket.java +++ b/src/main/java/step4/domain/LuckyTicket.java @@ -1,15 +1,26 @@ package step4.domain; +import java.util.Collections; +import java.util.List; + public class LuckyTicket { - private final LottoTicket luckyTicket; + private final List luckyNumber; private final LottoNumber bonusNumber; - public LuckyTicket(LottoTicket luckyTicket, LottoNumber bonusNumber) { - this.luckyTicket = luckyTicket; + public LuckyTicket(List luckyNumber, LottoNumber bonusNumber) { + this.luckyNumber = luckyNumber; this.bonusNumber = bonusNumber; } - public static LuckyTicket of(LottoTicket luckyTicket, LottoNumber bonusNumber) { - return new LuckyTicket(luckyTicket, bonusNumber); + public static LuckyTicket of(List luckyNumber, LottoNumber bonusNumber) { + return new LuckyTicket(luckyNumber, bonusNumber); + } + + public List getLuckyNumber() { + return Collections.unmodifiableList(luckyNumber); + } + + public boolean checkBonusNumber(List lottoTicket) { + return lottoTicket.contains(bonusNumber); } } diff --git a/src/main/java/step4/domain/ResultSheet.java b/src/main/java/step4/domain/ResultSheet.java index ca08f9177cf..1f9dd06c2d5 100644 --- a/src/main/java/step4/domain/ResultSheet.java +++ b/src/main/java/step4/domain/ResultSheet.java @@ -13,13 +13,13 @@ private ResultSheet(Map resultSheet) { this.resultSheet = resultSheet; } - public static ResultSheet getResult(LottoTickets lottoTickets, LottoTicket luckyNumber, int bonusNumber) { + public static ResultSheet getResult(LottoTickets lottoTickets, LuckyTicket luckyTicket) { Map lottoResultMap = new HashMap<>(); for (LottoTicket ticket : lottoTickets.getLottoTickets()) { LottoRank lottoRank = LottoRank.from( - ticket.getNumberOfMatchedToLuckyNumber(luckyNumber), - ticket.isBonusNumberMatched(LottoNumber.from(bonusNumber))); + ticket.getNumberOfMatchedToLuckyNumber(luckyTicket), + ticket.isBonusNumberMatched(luckyTicket)); int numberOfTicketsCorrespondingToRank = lottoResultMap.getOrDefault(lottoRank, 0); lottoResultMap.put(lottoRank, ++numberOfTicketsCorrespondingToRank); } From dfd3c028f12e32a8aa27001ca3104eebbb27e497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 10:34:52 +0900 Subject: [PATCH 07/20] =?UTF-8?q?[step4]=20refactor=20:=20LottoRank?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=A0=EB=95=8C=20=EC=9B=90?= =?UTF-8?q?=EC=8B=9C=EA=B0=92=20=EB=8C=80=EC=8B=A0=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/domain/LottoRank.java | 4 +++- src/main/java/step4/domain/ResultSheet.java | 4 +--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/step4/domain/LottoRank.java b/src/main/java/step4/domain/LottoRank.java index c036081f255..40525b569ce 100644 --- a/src/main/java/step4/domain/LottoRank.java +++ b/src/main/java/step4/domain/LottoRank.java @@ -19,7 +19,9 @@ public enum LottoRank { this.prizeMoney = prizeMoney; } - public static LottoRank from(int countMatchedNumbers, boolean isMatchedToBonusNumber) { + public static LottoRank from(LottoTicket lottoTicket, LuckyTicket luckyTicket) { + int countMatchedNumbers = lottoTicket.getNumberOfMatchedToLuckyNumber(luckyTicket); + boolean isMatchedToBonusNumber = lottoTicket.isBonusNumberMatched(luckyTicket); if ((countMatchedNumbers == SECOND_PLACE.numberOfMatchedToLuckyNumber) && isMatchedToBonusNumber) { return Arrays.stream(LottoRank.values()) .filter(lottoRank -> lottoRank.prizeMoney == SECOND_PLACE.prizeMoney) diff --git a/src/main/java/step4/domain/ResultSheet.java b/src/main/java/step4/domain/ResultSheet.java index 1f9dd06c2d5..8269fac6b88 100644 --- a/src/main/java/step4/domain/ResultSheet.java +++ b/src/main/java/step4/domain/ResultSheet.java @@ -17,9 +17,7 @@ public static ResultSheet getResult(LottoTickets lottoTickets, LuckyTicket lucky Map lottoResultMap = new HashMap<>(); for (LottoTicket ticket : lottoTickets.getLottoTickets()) { - LottoRank lottoRank = LottoRank.from( - ticket.getNumberOfMatchedToLuckyNumber(luckyTicket), - ticket.isBonusNumberMatched(luckyTicket)); + LottoRank lottoRank = LottoRank.from(ticket, luckyTicket); int numberOfTicketsCorrespondingToRank = lottoResultMap.getOrDefault(lottoRank, 0); lottoResultMap.put(lottoRank, ++numberOfTicketsCorrespondingToRank); } From 942152fb4092f3d3793a13c5116e2bcceb186e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 10:40:25 +0900 Subject: [PATCH 08/20] =?UTF-8?q?[step4]=20refactor=20:=20LottoRank=20?= =?UTF-8?q?=EC=A0=95=EC=A0=81=ED=8C=A9=ED=86=A0=EB=A6=AC=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EC=9D=98=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/domain/LottoRank.java | 6 ++---- src/main/java/step4/domain/ResultSheet.java | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/step4/domain/LottoRank.java b/src/main/java/step4/domain/LottoRank.java index 40525b569ce..aa06670acf1 100644 --- a/src/main/java/step4/domain/LottoRank.java +++ b/src/main/java/step4/domain/LottoRank.java @@ -22,11 +22,9 @@ public enum LottoRank { public static LottoRank from(LottoTicket lottoTicket, LuckyTicket luckyTicket) { int countMatchedNumbers = lottoTicket.getNumberOfMatchedToLuckyNumber(luckyTicket); boolean isMatchedToBonusNumber = lottoTicket.isBonusNumberMatched(luckyTicket); + if ((countMatchedNumbers == SECOND_PLACE.numberOfMatchedToLuckyNumber) && isMatchedToBonusNumber) { - return Arrays.stream(LottoRank.values()) - .filter(lottoRank -> lottoRank.prizeMoney == SECOND_PLACE.prizeMoney) - .findFirst() - .get(); + return LottoRank.SECOND_PLACE; } return Arrays.stream(LottoRank.values()) .filter(lottoRank -> lottoRank.numberOfMatchedToLuckyNumber == countMatchedNumbers) diff --git a/src/main/java/step4/domain/ResultSheet.java b/src/main/java/step4/domain/ResultSheet.java index 8269fac6b88..487a24ec4b7 100644 --- a/src/main/java/step4/domain/ResultSheet.java +++ b/src/main/java/step4/domain/ResultSheet.java @@ -16,8 +16,8 @@ private ResultSheet(Map resultSheet) { public static ResultSheet getResult(LottoTickets lottoTickets, LuckyTicket luckyTicket) { Map lottoResultMap = new HashMap<>(); - for (LottoTicket ticket : lottoTickets.getLottoTickets()) { - LottoRank lottoRank = LottoRank.from(ticket, luckyTicket); + for (LottoTicket lottoTicket : lottoTickets.getLottoTickets()) { + LottoRank lottoRank = LottoRank.from(lottoTicket, luckyTicket); int numberOfTicketsCorrespondingToRank = lottoResultMap.getOrDefault(lottoRank, 0); lottoResultMap.put(lottoRank, ++numberOfTicketsCorrespondingToRank); } From 9fdd2835243df25831ff8d4f701bcef13a57aef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 11:10:10 +0900 Subject: [PATCH 09/20] =?UTF-8?q?[step4]=20refactor=20:=20OutputView?= =?UTF-8?q?=EC=9D=98=20=EB=8B=B9=EC=B2=A8=EA=B2=B0=EA=B3=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/domain/LuckyTicket.java | 6 ++--- src/main/java/step4/view/OutputView.java | 28 ++++++++++----------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/step4/domain/LuckyTicket.java b/src/main/java/step4/domain/LuckyTicket.java index ed864962fd6..27721411bd6 100644 --- a/src/main/java/step4/domain/LuckyTicket.java +++ b/src/main/java/step4/domain/LuckyTicket.java @@ -7,12 +7,12 @@ public class LuckyTicket { private final List luckyNumber; private final LottoNumber bonusNumber; - public LuckyTicket(List luckyNumber, LottoNumber bonusNumber) { + private LuckyTicket(List luckyNumber, LottoNumber bonusNumber) { this.luckyNumber = luckyNumber; this.bonusNumber = bonusNumber; } - public static LuckyTicket of(List luckyNumber, LottoNumber bonusNumber) { + static LuckyTicket of(List luckyNumber, LottoNumber bonusNumber) { return new LuckyTicket(luckyNumber, bonusNumber); } @@ -20,7 +20,7 @@ public List getLuckyNumber() { return Collections.unmodifiableList(luckyNumber); } - public boolean checkBonusNumber(List lottoTicket) { + boolean checkBonusNumber(List lottoTicket) { return lottoTicket.contains(bonusNumber); } } diff --git a/src/main/java/step4/view/OutputView.java b/src/main/java/step4/view/OutputView.java index 041990e325a..195f2264a98 100644 --- a/src/main/java/step4/view/OutputView.java +++ b/src/main/java/step4/view/OutputView.java @@ -27,24 +27,24 @@ public static void printLottoTickets(LottoTickets lottoTickets) { public static void printResult(ResultSheet result) { System.out.println("당첨 통계"); System.out.println("---------"); - for (LottoRank rank : LottoRank.values()) { - if (rank.getPrizeMoney() == SECOND_PLACE_PRIZE) { - printResultContent(result, rank, MESSAGE_FOR_ONLY_SECOND_PLACE); - } - if (rank.getPrizeMoney() != SECOND_PLACE_PRIZE) { - printResultContent(result, rank, MESSAGE_FOR_LOTTO_RESULT); - } - //TODO: Q. else 구문을 안쓰면서도 이 부분을 어떻게 개선할 수 있을지 궁금합니다..! + printResultContent(result, rank); } System.out.println(String.format(MESSAGE_FOR_EARNING_RATE, result.getEarningRate())); } - private static void printResultContent(ResultSheet result, LottoRank rank, String messageFormat) { - System.out.println(String.format(messageFormat, - rank.getNumberOfMatchingNumber(), - rank.getPrizeMoney(), - result.getResultMap().getOrDefault(rank, PRIZE_FOR_LOSER))); + private static void printResultContent(ResultSheet result, LottoRank rank) { + if (rank.getPrizeMoney() == SECOND_PLACE_PRIZE) { + System.out.println(String.format(MESSAGE_FOR_ONLY_SECOND_PLACE, + rank.getNumberOfMatchingNumber(), + rank.getPrizeMoney(), + result.getResultMap().getOrDefault(rank, PRIZE_FOR_LOSER))); + } + if (rank.getPrizeMoney() != SECOND_PLACE_PRIZE) { + System.out.println(String.format(MESSAGE_FOR_LOTTO_RESULT, + rank.getNumberOfMatchingNumber(), + rank.getPrizeMoney(), + result.getResultMap().getOrDefault(rank, PRIZE_FOR_LOSER))); + } } - } From e7d132501ffc889c4a53c865ee2e28793cf7a2a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 11:26:13 +0900 Subject: [PATCH 10/20] =?UTF-8?q?[step4]=20refactor=20:=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/step4/domain/LottoSellerTest.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/test/java/step4/domain/LottoSellerTest.java b/src/test/java/step4/domain/LottoSellerTest.java index 1e7efa994ec..7877bfb18f8 100644 --- a/src/test/java/step4/domain/LottoSellerTest.java +++ b/src/test/java/step4/domain/LottoSellerTest.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -45,23 +44,24 @@ public class LottoSellerTest { int numberOfTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); //When - List lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); + LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); //Then - assertThat(lottoTickets.size()).isEqualTo(numberOfTicketsToBuy); + assertThat(lottoTickets.getLottoTickets().size()).isEqualTo(numberOfTicketsToBuy); } @Test void 당첨번호와_일치한_번호_개수를_반환한다() { //Given List testLuckyNumber = Arrays.asList(1, 2, 3, 4, 5, 6); - LottoTicket luckyNumber = LottoSeller.getLuckyNumber(testLuckyNumber); + int bonusNumber = 7; + LuckyTicket luckyTicket = LottoSeller.getLuckyNumber(testLuckyNumber, bonusNumber); List matchesThreeNumbers = Arrays.asList(1, 3, 5, 7, 9, 11); LottoTicket ticketMatchesThreeNumbers = new LottoTicket(LottoTicketGenerator.pickLottoBalls(matchesThreeNumbers)); //When - long result = ticketMatchesThreeNumbers.getNumberOfMatchedToLuckyNumber(luckyNumber); + long result = ticketMatchesThreeNumbers.getNumberOfMatchedToLuckyNumber(luckyTicket); //Then assertThat(result).isEqualTo(3); @@ -71,7 +71,8 @@ public class LottoSellerTest { void 당첨통계를_반환한다() { //Given List testLuckyNumber = Arrays.asList(1, 2, 3, 4, 5, 6); - LottoTicket luckyNumber = LottoSeller.getLuckyNumber(testLuckyNumber); + int bonusNumber = 7; + LuckyTicket luckyTicket = LottoSeller.getLuckyNumber(testLuckyNumber, bonusNumber); List matchesFourNumbers = Arrays.asList(1, 2, 3, 4, 7, 8); List matchesFiveNumbers = Arrays.asList(1, 2, 3, 4, 5, 8); @@ -85,11 +86,11 @@ public class LottoSellerTest { lottoTickets.add(ticketMatchesSixNumbers); //When - Map> resultMap = LottoSeller.getLottoResult(lottoTickets, luckyNumber); + ResultSheet resultMap = ResultSheet.getResult(LottoTickets.from(lottoTickets), luckyTicket); //Then - assertThat(resultMap.get(LottoRank.FIRST_PLACE).get(0)).isEqualTo(ticketMatchesSixNumbers); - assertThat(resultMap.get(LottoRank.SECOND_PLACE).get(0)).isEqualTo(ticketMatchesFiveNumbers); - assertThat(resultMap.get(LottoRank.THIRD_PLACE).get(0)).isEqualTo(ticketMatchesFourNumbers); + assertThat(resultMap.getResultMap().get(LottoRank.FIRST_PLACE)).isEqualTo(1); + assertThat(resultMap.getResultMap().get(LottoRank.SECOND_PLACE)).isEqualTo(1); + assertThat(resultMap.getResultMap().get(LottoRank.THIRD_PLACE)).isEqualTo(1); } } From 10324b9c6eaf4dc6fcb4c1617429e4ff80b2d111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 12:43:22 +0900 Subject: [PATCH 11/20] =?UTF-8?q?[step4]=20feat=20:=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=EC=88=98=EB=8F=99=20=EA=B5=AC=EB=A7=A4=20view=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/LottoApplication.java | 4 +++- src/main/java/step4/view/InputView.java | 21 +++++++++++++++++++++ src/main/java/step4/view/OutputView.java | 8 ++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java index 3f07beac94d..4cccb0f9e39 100644 --- a/src/main/java/step4/LottoApplication.java +++ b/src/main/java/step4/LottoApplication.java @@ -10,7 +10,9 @@ public class LottoApplication { public static void main(String[] args) { final int inputMoney = InputView.askMoneyToInput(); - final int numberOfTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); + final int numberOfManualTickets = InputView.askNumberOfManualTicket(); +// final int numberOfTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); + OutputView.printNumberOfTickets(numberOfTicketsToBuy); LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); diff --git a/src/main/java/step4/view/InputView.java b/src/main/java/step4/view/InputView.java index 06fc6baed3f..7970eacd0c9 100644 --- a/src/main/java/step4/view/InputView.java +++ b/src/main/java/step4/view/InputView.java @@ -14,6 +14,27 @@ public static int askMoneyToInput() { return scanner.nextInt(); } + public static int askNumberOfManualTicket() { + printBlackLine(); + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + return scanner.nextInt(); + } + + public static List askNumbersForManualLotto() { + printBlackLine(); + scanner.nextLine(); + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + String numbersForManualLotto = scanner.nextLine(); + printBlackLine(); + + return Arrays.stream(numbersForManualLotto.split(LUCKY_NUMBER_SEPARATOR)) + .map(String::trim) + .mapToInt(Integer::parseInt) + .boxed() + .collect(Collectors.toList()); + } + + public static List askLuckyNumber() { printBlackLine(); scanner.nextLine(); diff --git a/src/main/java/step4/view/OutputView.java b/src/main/java/step4/view/OutputView.java index 195f2264a98..ed6a42ea048 100644 --- a/src/main/java/step4/view/OutputView.java +++ b/src/main/java/step4/view/OutputView.java @@ -14,8 +14,12 @@ public class OutputView { private static final String MESSAGE_FOR_ONLY_SECOND_PLACE = "%d개 일치, 보너스 볼 일치 (%d원) - %d개"; private static final int SECOND_PLACE_PRIZE = 30_000_000; - public static void printNumberOfTickets(int numberOfLottoTicketsToBuy) { - System.out.println(numberOfLottoTicketsToBuy + "개를 구매했습니다."); +// public static void printNumberOfTickets(int numberOfLottoTicketsToBuy) { +// System.out.println(numberOfLottoTicketsToBuy + "개를 구매했습니다."); +// } + + public static void printNumberOfTickets(int numberOfManualTickets, int numberOfAutoTickets) { + System.out.println("수동으로 " + numberOfManualTickets + "장 " + "자동으로 " + numberOfAutoTickets + "개를 구매했습니다."); } public static void printLottoTickets(LottoTickets lottoTickets) { From d133891fd8666b68f2be326c9640c79a3b81029d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 12:56:10 +0900 Subject: [PATCH 12/20] =?UTF-8?q?[step4]=20feat=20:=20=EA=B0=81=20?= =?UTF-8?q?=EC=88=98=EB=8F=99=EB=A1=9C=EB=98=90=EC=99=80=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EB=A1=9C=EB=98=90=20=EA=B0=9C=EC=88=98=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/LottoApplication.java | 6 +++--- src/main/java/step4/domain/LottoSeller.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java index 4cccb0f9e39..c412f239f6a 100644 --- a/src/main/java/step4/LottoApplication.java +++ b/src/main/java/step4/LottoApplication.java @@ -11,11 +11,11 @@ public class LottoApplication { public static void main(String[] args) { final int inputMoney = InputView.askMoneyToInput(); final int numberOfManualTickets = InputView.askNumberOfManualTicket(); -// final int numberOfTicketsToBuy = LottoSeller.countLottoTickets(inputMoney); + final int numberOfAutoTickets = LottoSeller.countAutoTickets(inputMoney, numberOfManualTickets); - OutputView.printNumberOfTickets(numberOfTicketsToBuy); + OutputView.printNumberOfTickets(numberOfManualTickets, numberOfAutoTickets); - LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfTicketsToBuy); + LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfManualTickets, numberOfAutoTickets); OutputView.printLottoTickets(lottoTickets); LuckyTicket luckyTicket = LottoSeller diff --git a/src/main/java/step4/domain/LottoSeller.java b/src/main/java/step4/domain/LottoSeller.java index 8ed368e0c4f..17208266077 100644 --- a/src/main/java/step4/domain/LottoSeller.java +++ b/src/main/java/step4/domain/LottoSeller.java @@ -8,9 +8,9 @@ public class LottoSeller { static final int PRICE_OF_A_LOTTO_TICKET = 1000; static final String ALERT_MISSING_MONEY = "돈을 넣어주세요. 로또복권은 한 장당 1000원 입니다."; - public static int countLottoTickets(int inputMoney) { + public static int countAutoTickets(int inputMoney, int numberOfManualTickets) { validationInputMoney(inputMoney); - return inputMoney / PRICE_OF_A_LOTTO_TICKET; + return (inputMoney / PRICE_OF_A_LOTTO_TICKET) - numberOfManualTickets; } public static LottoTickets issueLottoTicket(int numberOfTicketsToBuy) { From 68d9f5d57e678d7e41ec588de44663ba6abbf339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 13:20:47 +0900 Subject: [PATCH 13/20] =?UTF-8?q?[step4]=20feat=20:=20=EC=88=98=EB=8F=99?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EA=B5=AC=EB=A7=A4=ED=95=A0=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A5=BC=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EC=95=84=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=EC=9C=BC=EB=A1=9C=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/LottoApplication.java | 5 ++++- src/main/java/step4/view/InputView.java | 22 ++++++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java index c412f239f6a..4ab6a24cc30 100644 --- a/src/main/java/step4/LottoApplication.java +++ b/src/main/java/step4/LottoApplication.java @@ -13,9 +13,12 @@ public static void main(String[] args) { final int numberOfManualTickets = InputView.askNumberOfManualTicket(); final int numberOfAutoTickets = LottoSeller.countAutoTickets(inputMoney, numberOfManualTickets); + // 수동으로 구매할 번호 입력 + List> manualTickets = InputView.askNumbersForManualTickets(numberOfManualTickets); + OutputView.printNumberOfTickets(numberOfManualTickets, numberOfAutoTickets); - LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfManualTickets, numberOfAutoTickets); + LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfAutoTickets); OutputView.printLottoTickets(lottoTickets); LuckyTicket luckyTicket = LottoSeller diff --git a/src/main/java/step4/view/InputView.java b/src/main/java/step4/view/InputView.java index 7970eacd0c9..2c9e2da39aa 100644 --- a/src/main/java/step4/view/InputView.java +++ b/src/main/java/step4/view/InputView.java @@ -1,5 +1,6 @@ package step4.view; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -20,18 +21,23 @@ public static int askNumberOfManualTicket() { return scanner.nextInt(); } - public static List askNumbersForManualLotto() { + public static List> askNumbersForManualTickets(int numberOfManualTickets) { printBlackLine(); scanner.nextLine(); System.out.println("수동으로 구매할 번호를 입력해 주세요."); - String numbersForManualLotto = scanner.nextLine(); - printBlackLine(); + List> manualTickets = new ArrayList<>(); - return Arrays.stream(numbersForManualLotto.split(LUCKY_NUMBER_SEPARATOR)) - .map(String::trim) - .mapToInt(Integer::parseInt) - .boxed() - .collect(Collectors.toList()); + for (int i = 0; i < numberOfManualTickets; i++) { + String inputString = scanner.nextLine(); + manualTickets.add( + Arrays.stream(inputString.split(LUCKY_NUMBER_SEPARATOR)) + .map(String::trim) + .mapToInt(Integer::parseInt) + .boxed() + .collect(Collectors.toList())); + } + printBlackLine(); + return manualTickets; } From 666b3342f81e4e9b9ffbca97e293623e1b5c783a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 14:13:30 +0900 Subject: [PATCH 14/20] =?UTF-8?q?[step4]=20feat=20:=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=90=98=EB=8A=94=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=EB=B3=B5=EA=B6=8C=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EC=97=90=20?= =?UTF-8?q?=EC=88=98=EB=8F=99=EB=B3=B5=EA=B6=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/LottoApplication.java | 2 +- src/main/java/step4/domain/LottoSeller.java | 22 ++++++++++++++----- .../step4/domain/LottoTicketGenerator.java | 9 +++++++- src/main/java/step4/domain/ResultSheet.java | 5 ++--- src/main/java/step4/view/InputView.java | 2 -- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java index 4ab6a24cc30..15c2edcda6d 100644 --- a/src/main/java/step4/LottoApplication.java +++ b/src/main/java/step4/LottoApplication.java @@ -18,7 +18,7 @@ public static void main(String[] args) { OutputView.printNumberOfTickets(numberOfManualTickets, numberOfAutoTickets); - LottoTickets lottoTickets = LottoSeller.issueLottoTicket(numberOfAutoTickets); + LottoTickets lottoTickets = LottoSeller.issueLottoTicket(manualTickets, numberOfAutoTickets); OutputView.printLottoTickets(lottoTickets); LuckyTicket luckyTicket = LottoSeller diff --git a/src/main/java/step4/domain/LottoSeller.java b/src/main/java/step4/domain/LottoSeller.java index 17208266077..b8a3b33d6aa 100644 --- a/src/main/java/step4/domain/LottoSeller.java +++ b/src/main/java/step4/domain/LottoSeller.java @@ -7,17 +7,23 @@ public class LottoSeller { static final int PRICE_OF_A_LOTTO_TICKET = 1000; static final String ALERT_MISSING_MONEY = "돈을 넣어주세요. 로또복권은 한 장당 1000원 입니다."; + private static final String ALERT_SHORT_OF_MONEY = "돈이 모자랍니다."; + private static final String ALERT_NEGATIVE_NUMBER = "구매할 수동로또 개수는 음수가 될 수 없습니다."; public static int countAutoTickets(int inputMoney, int numberOfManualTickets) { - validationInputMoney(inputMoney); + validationInputData(inputMoney, numberOfManualTickets); return (inputMoney / PRICE_OF_A_LOTTO_TICKET) - numberOfManualTickets; } - public static LottoTickets issueLottoTicket(int numberOfTicketsToBuy) { + public static LottoTickets issueLottoTicket(List> manualTickets, int numberOfAutoTickets) { List lottoTickets = new ArrayList<>(); - for (int i = 0; i < numberOfTicketsToBuy; i++) { - lottoTickets.add(LottoTicketGenerator.issue()); + for (List manualTicket : manualTickets) { + lottoTickets.add(LottoTicketGenerator.issueManualTickets(manualTicket)); + } + + for (int i = 0; i < numberOfAutoTickets; i++) { //TODO: index i가 사용되지 않고있음 + lottoTickets.add(LottoTicketGenerator.issueAutoTickets()); } return LottoTickets.from(lottoTickets); } @@ -29,9 +35,15 @@ public static LuckyTicket getLuckyNumber(List inputLuckyNumber, int bon return LuckyTicket.of(luckyTicket, LottoNumber.from(bonusNumber)); } - private static void validationInputMoney(int inputMoney) { + private static void validationInputData(int inputMoney, int numberOfManualTickets) { if (inputMoney < PRICE_OF_A_LOTTO_TICKET) { throw new IllegalArgumentException(ALERT_MISSING_MONEY); } + if (numberOfManualTickets < 0) { + throw new IllegalArgumentException(ALERT_NEGATIVE_NUMBER); + } + if (numberOfManualTickets * PRICE_OF_A_LOTTO_TICKET > inputMoney) { + throw new IllegalArgumentException(ALERT_SHORT_OF_MONEY); + } } } diff --git a/src/main/java/step4/domain/LottoTicketGenerator.java b/src/main/java/step4/domain/LottoTicketGenerator.java index 15b0d218077..3c764ab28ed 100644 --- a/src/main/java/step4/domain/LottoTicketGenerator.java +++ b/src/main/java/step4/domain/LottoTicketGenerator.java @@ -7,10 +7,17 @@ public class LottoTicketGenerator { static final int BASIC_LOTTO_SIZE = 6; - static LottoTicket issue() { + static LottoTicket issueAutoTickets() { return new LottoTicket(pickLottoBalls(LottoBalls.getLottoBalls())); } + static LottoTicket issueManualTickets(List manualTicket) { + return new LottoTicket(manualTicket.stream() + .sorted() + .map(LottoNumber::from) + .collect(Collectors.toList())); + } + static List pickLottoBalls(List lottoBalls) { shuffleLottoBalls(lottoBalls); return lottoBalls.stream() diff --git a/src/main/java/step4/domain/ResultSheet.java b/src/main/java/step4/domain/ResultSheet.java index 487a24ec4b7..208f1173dda 100644 --- a/src/main/java/step4/domain/ResultSheet.java +++ b/src/main/java/step4/domain/ResultSheet.java @@ -1,7 +1,6 @@ package step4.domain; import java.util.HashMap; -import java.util.List; import java.util.Map; public class ResultSheet { @@ -28,7 +27,7 @@ private int getTotalTicketsBought() { return resultSheet.values() .stream() .reduce(Integer::sum) - .get(); + .orElse(0); } private int totalMoneySpentForTickets() { @@ -51,7 +50,7 @@ private int getTotalPrizeMoney() { } public double getEarningRate() { - return getTotalPrizeMoney() / totalMoneySpentForTickets(); + return (double) getTotalPrizeMoney() / totalMoneySpentForTickets(); } public Map getResultMap() { diff --git a/src/main/java/step4/view/InputView.java b/src/main/java/step4/view/InputView.java index 2c9e2da39aa..68a495137c2 100644 --- a/src/main/java/step4/view/InputView.java +++ b/src/main/java/step4/view/InputView.java @@ -40,10 +40,8 @@ public static List> askNumbersForManualTickets(int numberOfManualT return manualTickets; } - public static List askLuckyNumber() { printBlackLine(); - scanner.nextLine(); System.out.println("지난 주 당첨 번호를 입력해주세요."); String inputLuckyNumber = scanner.nextLine(); printBlackLine(); From ebc0ef6daf35679a4b0d1079364d0009d39ea840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 14:27:03 +0900 Subject: [PATCH 15/20] =?UTF-8?q?[step4]=20refactor=20:=20=EC=B4=9D=20?= =?UTF-8?q?=EA=B5=AC=EC=9E=85=EA=B0=9C=EC=88=98=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/domain/LottoSeller.java | 3 +-- src/main/java/step4/view/OutputView.java | 13 ++++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/step4/domain/LottoSeller.java b/src/main/java/step4/domain/LottoSeller.java index b8a3b33d6aa..27533f1a610 100644 --- a/src/main/java/step4/domain/LottoSeller.java +++ b/src/main/java/step4/domain/LottoSeller.java @@ -21,8 +21,7 @@ public static LottoTickets issueLottoTicket(List> manualTickets, i for (List manualTicket : manualTickets) { lottoTickets.add(LottoTicketGenerator.issueManualTickets(manualTicket)); } - - for (int i = 0; i < numberOfAutoTickets; i++) { //TODO: index i가 사용되지 않고있음 + for (int i = 0; i < numberOfAutoTickets; i++) { //TODO: index i가 사용되지 않고 있음 lottoTickets.add(LottoTicketGenerator.issueAutoTickets()); } return LottoTickets.from(lottoTickets); diff --git a/src/main/java/step4/view/OutputView.java b/src/main/java/step4/view/OutputView.java index ed6a42ea048..c3b0fa83c2e 100644 --- a/src/main/java/step4/view/OutputView.java +++ b/src/main/java/step4/view/OutputView.java @@ -8,18 +8,17 @@ import java.util.List; public class OutputView { - private static final String MESSAGE_FOR_EARNING_RATE = "총 수익률은 %.2f 입니다."; + private static final String MESSAGE_FOR_TOTAL_NUMBER_OF_LOTTO_BOUGHT = "수동으로 %d개, 자동으로 %d개를 구매했습니다."; private static final String MESSAGE_FOR_LOTTO_RESULT = "%d개 일치 (%d원) - %d개"; - private static final int PRIZE_FOR_LOSER = 0; private static final String MESSAGE_FOR_ONLY_SECOND_PLACE = "%d개 일치, 보너스 볼 일치 (%d원) - %d개"; + private static final String MESSAGE_FOR_EARNING_RATE = "총 수익률은 %.2f 입니다."; + private static final int PRIZE_FOR_LOSER = 0; private static final int SECOND_PLACE_PRIZE = 30_000_000; -// public static void printNumberOfTickets(int numberOfLottoTicketsToBuy) { -// System.out.println(numberOfLottoTicketsToBuy + "개를 구매했습니다."); -// } - public static void printNumberOfTickets(int numberOfManualTickets, int numberOfAutoTickets) { - System.out.println("수동으로 " + numberOfManualTickets + "장 " + "자동으로 " + numberOfAutoTickets + "개를 구매했습니다."); + System.out.println(String.format(MESSAGE_FOR_TOTAL_NUMBER_OF_LOTTO_BOUGHT, + numberOfManualTickets, + numberOfAutoTickets)); } public static void printLottoTickets(LottoTickets lottoTickets) { From ac292ebe0127968d88962b533da55c643c19d71f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 14:53:25 +0900 Subject: [PATCH 16/20] =?UTF-8?q?[step4]=20refactor=20:=205=EA=B0=9C=20?= =?UTF-8?q?=EB=A7=9E=EC=B6=94=EB=A9=B4=20=EB=AA=A8=EB=91=90=202=EB=93=B1?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=B6=94=EC=B6=9C=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/LottoApplication.java | 2 -- src/main/java/step4/domain/LottoBalls.java | 2 +- src/main/java/step4/domain/LottoRank.java | 1 + src/main/java/step4/domain/LuckyTicket.java | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java index 15c2edcda6d..5c77eaa9e97 100644 --- a/src/main/java/step4/LottoApplication.java +++ b/src/main/java/step4/LottoApplication.java @@ -13,9 +13,7 @@ public static void main(String[] args) { final int numberOfManualTickets = InputView.askNumberOfManualTicket(); final int numberOfAutoTickets = LottoSeller.countAutoTickets(inputMoney, numberOfManualTickets); - // 수동으로 구매할 번호 입력 List> manualTickets = InputView.askNumbersForManualTickets(numberOfManualTickets); - OutputView.printNumberOfTickets(numberOfManualTickets, numberOfAutoTickets); LottoTickets lottoTickets = LottoSeller.issueLottoTicket(manualTickets, numberOfAutoTickets); diff --git a/src/main/java/step4/domain/LottoBalls.java b/src/main/java/step4/domain/LottoBalls.java index ab94a510af7..53f61d205c9 100644 --- a/src/main/java/step4/domain/LottoBalls.java +++ b/src/main/java/step4/domain/LottoBalls.java @@ -11,7 +11,7 @@ public class LottoBalls { .boxed() .collect(Collectors.toList()); - public static List getLottoBalls() { + static List getLottoBalls() { return lottoBalls; } } diff --git a/src/main/java/step4/domain/LottoRank.java b/src/main/java/step4/domain/LottoRank.java index aa06670acf1..85dbff5aaf4 100644 --- a/src/main/java/step4/domain/LottoRank.java +++ b/src/main/java/step4/domain/LottoRank.java @@ -28,6 +28,7 @@ public static LottoRank from(LottoTicket lottoTicket, LuckyTicket luckyTicket) { } return Arrays.stream(LottoRank.values()) .filter(lottoRank -> lottoRank.numberOfMatchedToLuckyNumber == countMatchedNumbers) + .filter(lottoRank -> lottoRank.prizeMoney != SECOND_PLACE.prizeMoney) .findFirst() .orElse(LOSER); } diff --git a/src/main/java/step4/domain/LuckyTicket.java b/src/main/java/step4/domain/LuckyTicket.java index 27721411bd6..1eb845acd58 100644 --- a/src/main/java/step4/domain/LuckyTicket.java +++ b/src/main/java/step4/domain/LuckyTicket.java @@ -22,5 +22,4 @@ public List getLuckyNumber() { boolean checkBonusNumber(List lottoTicket) { return lottoTicket.contains(bonusNumber); - } } From 300fc9b9319a42edacfe4e0651fa8e5bc8ab163c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 15:00:46 +0900 Subject: [PATCH 17/20] =?UTF-8?q?[step4]=20refactor=20:=205=EB=93=B1=20?= =?UTF-8?q?=EB=AF=B8=EB=A7=8C(LOSER)=EB=8A=94=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/domain/LuckyTicket.java | 1 + src/main/java/step4/view/OutputView.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/step4/domain/LuckyTicket.java b/src/main/java/step4/domain/LuckyTicket.java index 1eb845acd58..27721411bd6 100644 --- a/src/main/java/step4/domain/LuckyTicket.java +++ b/src/main/java/step4/domain/LuckyTicket.java @@ -22,4 +22,5 @@ public List getLuckyNumber() { boolean checkBonusNumber(List lottoTicket) { return lottoTicket.contains(bonusNumber); + } } diff --git a/src/main/java/step4/view/OutputView.java b/src/main/java/step4/view/OutputView.java index c3b0fa83c2e..99aaa846f2d 100644 --- a/src/main/java/step4/view/OutputView.java +++ b/src/main/java/step4/view/OutputView.java @@ -5,6 +5,7 @@ import step4.domain.LottoTickets; import step4.domain.ResultSheet; +import java.util.Arrays; import java.util.List; public class OutputView { @@ -43,7 +44,7 @@ private static void printResultContent(ResultSheet result, LottoRank rank) { rank.getPrizeMoney(), result.getResultMap().getOrDefault(rank, PRIZE_FOR_LOSER))); } - if (rank.getPrizeMoney() != SECOND_PLACE_PRIZE) { + if (rank != LottoRank.LOSER && rank.getPrizeMoney() != SECOND_PLACE_PRIZE) { System.out.println(String.format(MESSAGE_FOR_LOTTO_RESULT, rank.getNumberOfMatchingNumber(), rank.getPrizeMoney(), From 5b725a15ba9be1c42be6da52caac1cccbde1f89b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=A0=95=EC=88=98?= Date: Fri, 28 Jun 2019 15:02:20 +0900 Subject: [PATCH 18/20] =?UTF-8?q?[step4]=20refactor=20:=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=EC=97=86=EB=8A=94=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/view/OutputView.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/step4/view/OutputView.java b/src/main/java/step4/view/OutputView.java index 99aaa846f2d..ed16eb875d1 100644 --- a/src/main/java/step4/view/OutputView.java +++ b/src/main/java/step4/view/OutputView.java @@ -5,9 +5,6 @@ import step4.domain.LottoTickets; import step4.domain.ResultSheet; -import java.util.Arrays; -import java.util.List; - public class OutputView { private static final String MESSAGE_FOR_TOTAL_NUMBER_OF_LOTTO_BOUGHT = "수동으로 %d개, 자동으로 %d개를 구매했습니다."; private static final String MESSAGE_FOR_LOTTO_RESULT = "%d개 일치 (%d원) - %d개"; From 0766b7065fbb4d34815f4b032adff7e47aac5080 Mon Sep 17 00:00:00 2001 From: 1nteger Date: Fri, 28 Jun 2019 23:46:00 +0900 Subject: [PATCH 19/20] =?UTF-8?q?[step4]=20refactor=20:=20(=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81)=20List>?= =?UTF-8?q?=20=EB=8C=80=EC=8B=A0=20List=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/LottoApplication.java | 2 +- src/main/java/step4/domain/LottoSeller.java | 17 ++++++++++++++--- src/main/java/step4/view/InputView.java | 17 +++++++---------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/main/java/step4/LottoApplication.java b/src/main/java/step4/LottoApplication.java index 5c77eaa9e97..0b0d63898ea 100644 --- a/src/main/java/step4/LottoApplication.java +++ b/src/main/java/step4/LottoApplication.java @@ -13,7 +13,7 @@ public static void main(String[] args) { final int numberOfManualTickets = InputView.askNumberOfManualTicket(); final int numberOfAutoTickets = LottoSeller.countAutoTickets(inputMoney, numberOfManualTickets); - List> manualTickets = InputView.askNumbersForManualTickets(numberOfManualTickets); + List manualTickets = InputView.askNumbersForManualTickets(numberOfManualTickets); OutputView.printNumberOfTickets(numberOfManualTickets, numberOfAutoTickets); LottoTickets lottoTickets = LottoSeller.issueLottoTicket(manualTickets, numberOfAutoTickets); diff --git a/src/main/java/step4/domain/LottoSeller.java b/src/main/java/step4/domain/LottoSeller.java index 27533f1a610..a594c9dfdbc 100644 --- a/src/main/java/step4/domain/LottoSeller.java +++ b/src/main/java/step4/domain/LottoSeller.java @@ -1,6 +1,7 @@ package step4.domain; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -9,17 +10,19 @@ public class LottoSeller { static final String ALERT_MISSING_MONEY = "돈을 넣어주세요. 로또복권은 한 장당 1000원 입니다."; private static final String ALERT_SHORT_OF_MONEY = "돈이 모자랍니다."; private static final String ALERT_NEGATIVE_NUMBER = "구매할 수동로또 개수는 음수가 될 수 없습니다."; + static final String NUMBER_SEPARATOR = ","; public static int countAutoTickets(int inputMoney, int numberOfManualTickets) { validationInputData(inputMoney, numberOfManualTickets); return (inputMoney / PRICE_OF_A_LOTTO_TICKET) - numberOfManualTickets; } - public static LottoTickets issueLottoTicket(List> manualTickets, int numberOfAutoTickets) { + public static LottoTickets issueLottoTicket(List manualTickets, int numberOfAutoTickets) { List lottoTickets = new ArrayList<>(); - for (List manualTicket : manualTickets) { - lottoTickets.add(LottoTicketGenerator.issueManualTickets(manualTicket)); + for (String manualTicket : manualTickets) { + List parsedManualTicket = parseToNumbers(manualTicket); + lottoTickets.add(LottoTicketGenerator.issueManualTickets(parsedManualTicket)); } for (int i = 0; i < numberOfAutoTickets; i++) { //TODO: index i가 사용되지 않고 있음 lottoTickets.add(LottoTicketGenerator.issueAutoTickets()); @@ -27,6 +30,14 @@ public static LottoTickets issueLottoTicket(List> manualTickets, i return LottoTickets.from(lottoTickets); } + private static List parseToNumbers(String manualTicket) { + return Arrays.stream(manualTicket.split(NUMBER_SEPARATOR)) + .map(String::trim) + .mapToInt(Integer::parseInt) + .boxed() + .collect(Collectors.toList()); + } + public static LuckyTicket getLuckyNumber(List inputLuckyNumber, int bonusNumber) { List luckyTicket = inputLuckyNumber.stream() .map(LottoNumber::from) diff --git a/src/main/java/step4/view/InputView.java b/src/main/java/step4/view/InputView.java index 68a495137c2..3b78af00835 100644 --- a/src/main/java/step4/view/InputView.java +++ b/src/main/java/step4/view/InputView.java @@ -1,5 +1,7 @@ package step4.view; +import step4.domain.LottoSeller; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -7,7 +9,7 @@ import java.util.stream.Collectors; public class InputView { - private static final String LUCKY_NUMBER_SEPARATOR = ","; + static final String NUMBER_SEPARATOR = ","; private static Scanner scanner = new Scanner(System.in); public static int askMoneyToInput() { @@ -21,20 +23,15 @@ public static int askNumberOfManualTicket() { return scanner.nextInt(); } - public static List> askNumbersForManualTickets(int numberOfManualTickets) { + public static List askNumbersForManualTickets(int numberOfManualTickets) { printBlackLine(); scanner.nextLine(); System.out.println("수동으로 구매할 번호를 입력해 주세요."); - List> manualTickets = new ArrayList<>(); + List manualTickets = new ArrayList<>(); for (int i = 0; i < numberOfManualTickets; i++) { String inputString = scanner.nextLine(); - manualTickets.add( - Arrays.stream(inputString.split(LUCKY_NUMBER_SEPARATOR)) - .map(String::trim) - .mapToInt(Integer::parseInt) - .boxed() - .collect(Collectors.toList())); + manualTickets.add(inputString); } printBlackLine(); return manualTickets; @@ -46,7 +43,7 @@ public static List askLuckyNumber() { String inputLuckyNumber = scanner.nextLine(); printBlackLine(); - return Arrays.stream(inputLuckyNumber.split(LUCKY_NUMBER_SEPARATOR)) + return Arrays.stream(inputLuckyNumber.split(NUMBER_SEPARATOR)) .map(String::trim) .mapToInt(Integer::parseInt) .boxed() From 0246b914e6dda1d30b2bb1cd57dc3cad3f9ec26e Mon Sep 17 00:00:00 2001 From: 1nteger Date: Fri, 28 Jun 2019 23:53:02 +0900 Subject: [PATCH 20/20] =?UTF-8?q?[step4]=20refactor=20:=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/step4/view/OutputView.java | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/step4/view/OutputView.java b/src/main/java/step4/view/OutputView.java index ed16eb875d1..7260be5ca76 100644 --- a/src/main/java/step4/view/OutputView.java +++ b/src/main/java/step4/view/OutputView.java @@ -7,8 +7,8 @@ public class OutputView { private static final String MESSAGE_FOR_TOTAL_NUMBER_OF_LOTTO_BOUGHT = "수동으로 %d개, 자동으로 %d개를 구매했습니다."; - private static final String MESSAGE_FOR_LOTTO_RESULT = "%d개 일치 (%d원) - %d개"; - private static final String MESSAGE_FOR_ONLY_SECOND_PLACE = "%d개 일치, 보너스 볼 일치 (%d원) - %d개"; + private static final String MESSAGE_FOR_ALL_PLACE = "%d개 일치 (%d원) - %d개"; + private static final String MESSAGE_FOR_SECOND_PLACE = "%d개 일치, 보너스 볼 일치 (%d원) - %d개"; private static final String MESSAGE_FOR_EARNING_RATE = "총 수익률은 %.2f 입니다."; private static final int PRIZE_FOR_LOSER = 0; private static final int SECOND_PLACE_PRIZE = 30_000_000; @@ -29,23 +29,14 @@ public static void printResult(ResultSheet result) { System.out.println("당첨 통계"); System.out.println("---------"); for (LottoRank rank : LottoRank.values()) { - printResultContent(result, rank); - } - System.out.println(String.format(MESSAGE_FOR_EARNING_RATE, result.getEarningRate())); - } - - private static void printResultContent(ResultSheet result, LottoRank rank) { - if (rank.getPrizeMoney() == SECOND_PLACE_PRIZE) { - System.out.println(String.format(MESSAGE_FOR_ONLY_SECOND_PLACE, - rank.getNumberOfMatchingNumber(), - rank.getPrizeMoney(), - result.getResultMap().getOrDefault(rank, PRIZE_FOR_LOSER))); - } - if (rank != LottoRank.LOSER && rank.getPrizeMoney() != SECOND_PLACE_PRIZE) { - System.out.println(String.format(MESSAGE_FOR_LOTTO_RESULT, + String messageFormat = + (rank.getPrizeMoney() == SECOND_PLACE_PRIZE) ? MESSAGE_FOR_SECOND_PLACE : MESSAGE_FOR_ALL_PLACE; + System.out.println(String.format(messageFormat, rank.getNumberOfMatchingNumber(), rank.getPrizeMoney(), result.getResultMap().getOrDefault(rank, PRIZE_FOR_LOSER))); } + System.out.println(String.format(MESSAGE_FOR_EARNING_RATE, result.getEarningRate())); } + }