From 58b33ed59e26a9b96a86b2d1c37b092181ceefba Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 13:26:23 +0900 Subject: [PATCH 01/35] =?UTF-8?q?docs(README.md):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 261 +++++++----------------------------------------------- 1 file changed, 31 insertions(+), 230 deletions(-) diff --git a/README.md b/README.md index d6299154c..1079b2d61 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,39 @@ # 지하철 노선도 경로 조회 미션 -- 등록된 지하철 노선도에서 경로를 조회하는 기능을 구현한다. -
+등록된 지하철 노선도에서 최단 거리/최소 시간으로 경로를 조회하는 프로그램 -## 🚀 기능 요구사항 +## 기능 목록 -> 프리코스 3주차 미션에서 사용한 코드를 참고해도 무관하다. + - [] 프로그램 시작 시 역, 노선, 구간 정보를 초기 설정한다. -### 초기 설정 -- 프로그램 시작 시 역, 노선, 구간 정보를 초기 설정 해야 한다. -- 거리와 소요 시간은 양의 정수이며 단위는 km와 분을 의미한다. -- 아래의 사전 등록 정보로 반드시 초기 설정을 한다. + - [] 메인 메뉴를 출력하고 사용자의 선택을 입력을 받는다. -``` - 1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다. - 2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다. - 3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점) - - 2호선: 교대역 - ( 2km / 3분 ) - 강남역 - ( 2km / 3분 ) - 역삼역 - - 3호선: 교대역 - ( 3km / 2분 ) - 남부터미널역 - ( 6km / 5분 ) - 양재역 - ( 1km / 1분 ) - 매봉역 - - 신분당선: 강남역 - ( 2km / 8분 ) - 양재역 - ( 10km / 3분 ) - 양재시민의숲역 - ``` - -### 경로 조회 기능 -- 출발역과 도착역을 입력받아 경로를 조회한다. -- 경로 조회 시 총 거리, 총 소요 시간도 함께 출력한다. -- 경로 조회 기준은 `최단 거리` `최소 시간`이 있다. + - [] 1 을 입력받으면 경로 조회 화면으로 전환한다. + - [] Q 를 입력받으면 프로그램을 종료한다. + - [] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. -### 예외 처리 -- 경로 조회 시 출발역과 도착역이 같으면 에러를 출력한다. -- 경로 조회 시 출발역과 도착역이 연결되어 있지 않으면 에러를 출력한다. -- 그 외 정상적으로 프로그램이 수행되지 않은 경우 에러를 출력한다. + - [] 조회할 경로의 기준을 출력하고 사용자의 선택을 입력받는다. -
+ - [] 1 을 입력받으면 최단 거리를 기준으로 경로를 조회한다. + - [] 2 를 입력받으면 최소 시간을 기준으로 경로를 조회한다. + - [] B 를 입력받으면 메인 메뉴로 돌아간다. + - [] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. -## ✍🏻 입출력 요구사항 -- `프로그래밍 실행 결과 예시`와 동일하게 입출력을 구현한다. -- 기대하는 출력 결과는 `[INFO]`를 붙여서 출력한다. 출력값의 형식은 예시와 동일하게 한다. -- 에러 발생 시 `[ERROR]`를 붙여서 출력한다. 에러의 문구는 자유롭게 작성한다. - -### 💻 프로그래밍 실행 결과 예시 -#### 경로 조회 -``` -## 메인 화면 -1. 경로 조회 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 경로 기준 -1. 최단 거리 -2. 최소 시간 -B. 돌아가기 + - [] 경로를 조회하는 기능에서는 출발역과 도착역을 설정한다. + + - [] 출발역을 입력받는다. + - [] 도착역을 입력받는다. + - [] [예외 처리] 등록되지 않은 역을 입력받으면 에러를 출력한다. + - [] [예외 처리] 입력받은 출발역과 도착역이 같으면 에러를 출력한다. -## 원하는 기능을 선택하세요. -1 + - [] 출발역에서 도착역까지 가는 최단 경로를 구한다. -## 출발역을 입력하세요. -교대역 + - [] [예외 처리] 출발 역과 도착역이 연결되어 있지 않으면 에러를 출력한다. -## 도착역을 입력하세요. -양재역 + - [] 출발역에서 도착역 까지 가는 경로를 포함하여 총 거리와 총 소요 시간을 아래와 같이 출력한다. -## 조회 결과 +``` +##조회 결과 [INFO] --- [INFO] 총 거리: 6km [INFO] 총 소요 시간: 14분 @@ -70,184 +41,14 @@ B. 돌아가기 [INFO] 교대역 [INFO] 강남역 [INFO] 양재역 - -## 메인 화면 -1. 경로 조회 -Q. 종료 - -... -``` - -#### 에러 출력 예시 - -``` -## 메인 화면 -1. 경로 조회 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 경로 기준 -1. 최단 거리 -2. 최소 시간 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 출발역을 입력하세요. -강남역 - -## 도착역을 입력하세요. -강남역 - -[ERROR] 출발역과 도착역이 동일합니다. - -## 경로 기준 -1. 최단 거리 -2. 최소 시간 -B. 돌아가기 - -## 원하는 기능을 선택하세요. - -... - -``` - -
- -## 🎱 프로그래밍 요구사항 -- 자바 코드 컨벤션을 지키면서 프로그래밍한다. - - 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)을 원칙으로 한다. - - 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다. -- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. - - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. - - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다. -- 3항 연산자를 쓰지 않는다. -- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다. - - 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다. -- else 예약어를 쓰지 않는다. - - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. - - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다. -- 프로그래밍 요구사항에서 별도로 변경 불가 안내가 없는 경우 파일 수정과 패키지 이동을 자유롭게 할 수 있다. -- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 `[ERROR]` 로 시작해야 한다. - -### 프로그래밍 요구사항 - Application -- Application 클래스를 활용해 구현해야 한다. -- Application의 패키지 구조는 변경하지 않는다. -- Application 클래스에 있는 Scanner를 사용하고 별도의 Scanner 객체를 만들지 않는다. -```java -public class Application { - public static void main(String[] args) { - final Scanner scanner = new Scanner(System.in); - ... - } -} -``` - -### 프로그래밍 요구사항 - Station, Line -- Station, Line 클래스를 활용하여 지하철역과 노선을 구현해야 한다. -- 제공하는 각 클래스의 기본 생성자를 추가할 수 없다. -- 필드(인스턴스 변수)인 name의 접근 제어자 private을 변경할 수 없다. -- 가능하면 setter 메소드(ex. setXXX)를 추가하지 않고 구현한다. - -```java -public class Station { - private String name; - - public Station(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - // 추가 기능 구현 -} - ``` -### 프로그래밍 요구사항 - StationRepository, LineRepository -- Station과 Line의 상태를 저장할 수 있는 StationRepository, LineRepository를 제공한다. -- 필요 시 StationRepository, LineRepository 이 외 추가로 Repository를 만들 수 있다. -- 추가로 생성되는 객체에 대해서 XXXRepository 네이밍으로 저장 클래스를 추가한다. -- 객체들의 상태를 관리하기 위해서 XXXRepository 클래스를 활용해 저장 로직을 구현해야 한다. -- 작성된 메서드는 수정할 수 없고, 필요에 따라 메서드를 자유롭게 추가할 수 있다. - -```java -public class StationRepository { - private static final List stations = new ArrayList<>(); - - public static List stations() { - return Collections.unmodifiableList(stations); - } - - public static void addStation(Station station) { - stations.add(station); - } - - public static boolean deleteStation(String name) { - return stations.removeIf(station -> Objects.equals(station.getName(), name)); - } - - public static void deleteAll() { - stations.clear(); - } -} -``` - -
- -## ❗️힌트 -### 최단 경로 라이브러리 -- jgrapht 라이브러리를 활용하면 간편하게 최단거리를 조회할 수 있음 -- Dijkstra 알고리즘을 반드시 이해할 필요는 없고 미션에 적용할 정도로만 이해하면 됨 -- JGraphtTest 클래스의 테스트를 활용하여 미션에 필요한 라이브러리의 기능을 학습할 수 있음 -- 정점(vertex)과 간선(edge), 그리고 가중치 개념을 이용 - - 정점: 지하철역 - - 간선: 지하철역 연결정보 - - 가중치: 거리 or 소요 시간 -- 최단 거리 기준 조회 시 가중치를 거리로 설정 +## 요구사항 -```java -@Test -public void getDijkstraShortestPath() { - WeightedMultigraph graph - = new WeightedMultigraph(DefaultWeightedEdge.class); - graph.addVertex("v1"); - graph.addVertex("v2"); - graph.addVertex("v3"); - graph.setEdgeWeight(graph.addEdge("v1", "v2"), 2); - graph.setEdgeWeight(graph.addEdge("v2", "v3"), 2); - graph.setEdgeWeight(graph.addEdge("v1", "v3"), 100); - - DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(graph); - List shortestPath = dijkstraShortestPath.getPath("v3", "v1").getVertexList(); - - assertThat(shortestPath.size()).isEqualTo(3); -} -``` - -#### 테스트 설명 - - - -- 역 사이의 거리를 고려하지 않는 경우 V1->V3 경로가 최단 경로 -- 역 사이의 거리를 고려할 경우 V1->V3 경로의 거리는 100km, V1->V2->V3 경로의 거리는 4km이므로 최단 경로는 V1->V2->V3 - -
- -## 📈 진행 요구사항 -- 미션은 [java-subway-path-precourse 저장소](https://github.com/woowacourse/java-subway-path-precourse) 를 fork/clone해 시작한다. -- 기능을 구현하기 전에 java-subway-path-precourse/docs/README.md 파일에 구현할 기능 목록을 정리해 추가한다. -- git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다. - - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다. -- [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 절차를 따라 미션을 제출한다. - - [프리코스 과제 FAQ](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse/faq) 문서를 참고하여 진행할 수 있다. -
- -## 📝 License - -This project is [MIT](https://github.com/woowacourse/java-subway-path-precourse/blob/master/LICENSE.md) licensed. + - 거리는 km, 시간은 분 단위로 계산한다. + + - 기대하는 출력 결과는 [INFO]를 붙인다. + + - 에러 출력은 [ERROR]를 붙인다. + + - jgrapht 라이브러리를 활용한다. \ No newline at end of file From 080b2226f63b6f4a74f6c6778e302d2392e7806c Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 13:45:15 +0900 Subject: [PATCH 02/35] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/main/java/subway/domain/MainMenu.java | 21 +++++++++++++++++++ .../java/subway/views/MainOutputView.java | 15 +++++++++++++ .../java/subway/views/OutputConstant.java | 8 +++++++ 4 files changed, 45 insertions(+) create mode 100644 src/main/java/subway/domain/MainMenu.java create mode 100644 src/main/java/subway/views/MainOutputView.java create mode 100644 src/main/java/subway/views/OutputConstant.java diff --git a/README.md b/README.md index 1079b2d61..fd6b9f703 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ - [] 메인 메뉴를 출력하고 사용자의 선택을 입력을 받는다. + - [x] 메인 메뉴를 출력한다. - [] 1 을 입력받으면 경로 조회 화면으로 전환한다. - [] Q 를 입력받으면 프로그램을 종료한다. - [] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. diff --git a/src/main/java/subway/domain/MainMenu.java b/src/main/java/subway/domain/MainMenu.java new file mode 100644 index 000000000..443d9569c --- /dev/null +++ b/src/main/java/subway/domain/MainMenu.java @@ -0,0 +1,21 @@ +package subway.domain; + +import subway.views.OutputConstant; + +public enum MainMenu { + ROUTE_LOOKUP("1", "경로 조회"), + EXIT_PROGRAM("Q", "종료"); + + private final String option; + private final String description; + + MainMenu(String option, String description) { + this.option = option; + this.description = description; + } + + @Override + public String toString() { + return option + OutputConstant.OPTION_SEPARATOR + description; + } +} diff --git a/src/main/java/subway/views/MainOutputView.java b/src/main/java/subway/views/MainOutputView.java new file mode 100644 index 000000000..85106d00d --- /dev/null +++ b/src/main/java/subway/views/MainOutputView.java @@ -0,0 +1,15 @@ +package subway.views; + +import subway.domain.MainMenu; + +import java.util.Arrays; + +public class MainOutputView { + private static final String MAIN_SCREEN_MESSAGE = "## 메인 화면"; + + public static void printMainView() { + System.out.println(MAIN_SCREEN_MESSAGE); + Arrays.stream(MainMenu.values()) + .forEach(System.out::println); + } +} diff --git a/src/main/java/subway/views/OutputConstant.java b/src/main/java/subway/views/OutputConstant.java new file mode 100644 index 000000000..040c050d8 --- /dev/null +++ b/src/main/java/subway/views/OutputConstant.java @@ -0,0 +1,8 @@ +package subway.views; + +public class OutputConstant { + public static final String OPTION_SEPARATOR = ". "; + + private OutputConstant() { + } +} From 0856ded6898696938bc7993a205b8d69c70b99b3 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 14:05:14 +0900 Subject: [PATCH 03/35] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=9E=85=EB=A0=A5=EC=9D=84=20=EB=B0=9B=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/main/java/subway/views/InputView.java | 11 +++++++++++ src/main/java/subway/views/OutputView.java | 10 ++++++++++ .../java/subway/views/mainviews/MainInputView.java | 13 +++++++++++++ .../views/{ => mainviews}/MainOutputView.java | 7 ++++--- 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 src/main/java/subway/views/InputView.java create mode 100644 src/main/java/subway/views/OutputView.java create mode 100644 src/main/java/subway/views/mainviews/MainInputView.java rename src/main/java/subway/views/{ => mainviews}/MainOutputView.java (63%) diff --git a/README.md b/README.md index fd6b9f703..8ed627a83 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ - [] 메인 메뉴를 출력하고 사용자의 선택을 입력을 받는다. - [x] 메인 메뉴를 출력한다. + - [x] 사용자의 입력을 받는다. - [] 1 을 입력받으면 경로 조회 화면으로 전환한다. - [] Q 를 입력받으면 프로그램을 종료한다. - [] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. diff --git a/src/main/java/subway/views/InputView.java b/src/main/java/subway/views/InputView.java new file mode 100644 index 000000000..f356c4737 --- /dev/null +++ b/src/main/java/subway/views/InputView.java @@ -0,0 +1,11 @@ +package subway.views; + +import java.util.Scanner; + +public interface InputView { + String LINE_WRAP = "\n"; + + static String userInput(Scanner scanner) { + return scanner.nextLine(); + } +} diff --git a/src/main/java/subway/views/OutputView.java b/src/main/java/subway/views/OutputView.java new file mode 100644 index 000000000..1bfdedda3 --- /dev/null +++ b/src/main/java/subway/views/OutputView.java @@ -0,0 +1,10 @@ +package subway.views; + +public interface OutputView { + String LINE_WRAP = "\n"; + String SELECT_FEATURE_MESSAGE = "## 원하는 기능을 선택하세요."; + + static void printSelectOptionMessage() { + System.out.println(LINE_WRAP + SELECT_FEATURE_MESSAGE); + } +} diff --git a/src/main/java/subway/views/mainviews/MainInputView.java b/src/main/java/subway/views/mainviews/MainInputView.java new file mode 100644 index 000000000..ea2708734 --- /dev/null +++ b/src/main/java/subway/views/mainviews/MainInputView.java @@ -0,0 +1,13 @@ +package subway.views.mainviews; + +import subway.views.InputView; +import subway.views.OutputView; + +import java.util.Scanner; + +public class MainInputView implements InputView{ + public static String inputOption(Scanner scanner) { + OutputView.printSelectOptionMessage(); + return InputView.userInput(scanner); + } +} diff --git a/src/main/java/subway/views/MainOutputView.java b/src/main/java/subway/views/mainviews/MainOutputView.java similarity index 63% rename from src/main/java/subway/views/MainOutputView.java rename to src/main/java/subway/views/mainviews/MainOutputView.java index 85106d00d..be3feaca4 100644 --- a/src/main/java/subway/views/MainOutputView.java +++ b/src/main/java/subway/views/mainviews/MainOutputView.java @@ -1,13 +1,14 @@ -package subway.views; +package subway.views.mainviews; import subway.domain.MainMenu; +import subway.views.OutputView; import java.util.Arrays; -public class MainOutputView { +public class MainOutputView implements OutputView { private static final String MAIN_SCREEN_MESSAGE = "## 메인 화면"; - public static void printMainView() { + public static void printMainMenu() { System.out.println(MAIN_SCREEN_MESSAGE); Arrays.stream(MainMenu.values()) .forEach(System.out::println); From 1f98f42e9b89dce5feb72a17750fdf91a9f0e475 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 14:40:23 +0900 Subject: [PATCH 04/35] =?UTF-8?q?feat:=20=EA=B2=BD=EB=A1=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EC=A4=80=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- src/main/java/subway/domain/RouteMenu.java | 22 +++++++++++++++++++ .../views/routeviews/RouteInputView.java | 7 ++++++ .../views/routeviews/RouteOutputView.java | 16 ++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/main/java/subway/domain/RouteMenu.java create mode 100644 src/main/java/subway/views/routeviews/RouteInputView.java create mode 100644 src/main/java/subway/views/routeviews/RouteOutputView.java diff --git a/README.md b/README.md index 8ed627a83..0a760677a 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,9 @@ - [] Q 를 입력받으면 프로그램을 종료한다. - [] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. - - [] 조회할 경로의 기준을 출력하고 사용자의 선택을 입력받는다. + - [] 경로를 조회할 기준을 출력하고 사용자의 선택을 입력받는다. + - [x] 경로를 조회할 기준 메뉴를 출력한다. - [] 1 을 입력받으면 최단 거리를 기준으로 경로를 조회한다. - [] 2 를 입력받으면 최소 시간을 기준으로 경로를 조회한다. - [] B 를 입력받으면 메인 메뉴로 돌아간다. diff --git a/src/main/java/subway/domain/RouteMenu.java b/src/main/java/subway/domain/RouteMenu.java new file mode 100644 index 000000000..dcc89e5b5 --- /dev/null +++ b/src/main/java/subway/domain/RouteMenu.java @@ -0,0 +1,22 @@ +package subway.domain; + +import subway.views.OutputConstant; + +public enum RouteMenu { + SHORTEST_DISTANCE("1", "최단 거리"), + SHORTEST_TIME("2", "최소 시간"), + GO_BACK_TO_MAIN_MENU("B", "돌아가기"); + + private final String option; + private final String description; + + RouteMenu(String option, String description) { + this.option = option; + this.description = description; + } + + @Override + public String toString() { + return option + OutputConstant.OPTION_SEPARATOR + description; + } +} diff --git a/src/main/java/subway/views/routeviews/RouteInputView.java b/src/main/java/subway/views/routeviews/RouteInputView.java new file mode 100644 index 000000000..2a674216a --- /dev/null +++ b/src/main/java/subway/views/routeviews/RouteInputView.java @@ -0,0 +1,7 @@ +package subway.views.routeviews; + +import subway.views.InputView; + +public class RouteInputView implements InputView { + +} diff --git a/src/main/java/subway/views/routeviews/RouteOutputView.java b/src/main/java/subway/views/routeviews/RouteOutputView.java new file mode 100644 index 000000000..58eb0a73e --- /dev/null +++ b/src/main/java/subway/views/routeviews/RouteOutputView.java @@ -0,0 +1,16 @@ +package subway.views.routeviews; + +import subway.domain.MainMenu; +import subway.views.OutputView; + +import java.util.Arrays; + +public class RouteOutputView implements OutputView { + private static final String ROUTE_SCREEN_MESSAGE = "## 경로 기준"; + + public static void printRouteMenu() { + System.out.println(LINE_WRAP + ROUTE_SCREEN_MESSAGE); + Arrays.stream(MainMenu.values()) + .forEach(System.out::println); + } +} From 46c25af568e99c71473d10616b703244d0dcfb69 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 14:48:04 +0900 Subject: [PATCH 05/35] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=EC=97=90=EC=84=9C=20=EC=84=A0=ED=83=9D=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20=EA=B8=B0=EB=8A=A5=20=EB=B6=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1번은 경로 기준 선택화면 Q는 프로그램 종료 다른 입력시 오류 출력 --- README.md | 6 +-- .../subway/controller/MainController.java | 45 +++++++++++++++++++ .../subway/controller/RouteController.java | 20 +++++++++ src/main/java/subway/domain/MainMenu.java | 23 ++++++++-- .../java/subway/views/OutputConstant.java | 1 + .../subway/views/mainviews/MainInputView.java | 2 +- .../views/routeviews/RouteOutputView.java | 3 +- 7 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 src/main/java/subway/controller/MainController.java create mode 100644 src/main/java/subway/controller/RouteController.java diff --git a/README.md b/README.md index 0a760677a..09bffc7ea 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ - [x] 메인 메뉴를 출력한다. - [x] 사용자의 입력을 받는다. - - [] 1 을 입력받으면 경로 조회 화면으로 전환한다. - - [] Q 를 입력받으면 프로그램을 종료한다. - - [] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. + - [x] 1 을 입력받으면 경로 조회 화면으로 전환한다. + - [x] Q 를 입력받으면 프로그램을 종료한다. + - [x] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. - [] 경로를 조회할 기준을 출력하고 사용자의 선택을 입력받는다. diff --git a/src/main/java/subway/controller/MainController.java b/src/main/java/subway/controller/MainController.java new file mode 100644 index 000000000..506a2404a --- /dev/null +++ b/src/main/java/subway/controller/MainController.java @@ -0,0 +1,45 @@ +package subway.controller; + +import subway.domain.MainMenu; +import subway.views.mainviews.MainInputView; +import subway.views.mainviews.MainOutputView; + +import java.util.Scanner; + +public class MainController { + private static final String END_CODE = "Q"; + private static final MainController mainController = new MainController(); + + private MainController() { + } + + public static MainController getInstance() { + return mainController; + } + + public void run(Scanner scanner) { + String selectedOption; + do { + selectedOption = mappingMainMenu(scanner); + } while(!selectedOption.equals(END_CODE)); + } + + private String mappingMainMenu(Scanner scanner) { + try { + MainOutputView.printMainMenu(); + String selectedOption = MainInputView.inputMainOption(scanner); + branchBySelectedOption(selectedOption, scanner); + return selectedOption; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return mappingMainMenu(scanner); + } + } + + private void branchBySelectedOption(String selectedOption, Scanner scanner) { + if (selectedOption.equals(END_CODE)) { + return; + } + MainMenu.execute(selectedOption, scanner); + } +} diff --git a/src/main/java/subway/controller/RouteController.java b/src/main/java/subway/controller/RouteController.java new file mode 100644 index 000000000..d1a5ef2c6 --- /dev/null +++ b/src/main/java/subway/controller/RouteController.java @@ -0,0 +1,20 @@ +package subway.controller; + +import subway.views.routeviews.RouteOutputView; + +import java.util.Scanner; + +public class RouteController { + private static final RouteController routeController = new RouteController(); + + private RouteController() { + } + + public static RouteController getInstance() { + return routeController; + } + + public void mappingMenu(Scanner scanner) { + RouteOutputView.printRouteMenu(); + } +} diff --git a/src/main/java/subway/domain/MainMenu.java b/src/main/java/subway/domain/MainMenu.java index 443d9569c..4d800b82b 100644 --- a/src/main/java/subway/domain/MainMenu.java +++ b/src/main/java/subway/domain/MainMenu.java @@ -1,17 +1,34 @@ package subway.domain; +import subway.controller.RouteController; import subway.views.OutputConstant; +import java.util.Arrays; +import java.util.Scanner; +import java.util.function.Supplier; + public enum MainMenu { - ROUTE_LOOKUP("1", "경로 조회"), - EXIT_PROGRAM("Q", "종료"); + ROUTE_LOOKUP("1", "경로 조회", RouteController::getInstance), + EXIT_PROGRAM("Q", "종료", () -> {return null;}); private final String option; private final String description; + private final Supplier routeController; - MainMenu(String option, String description) { + MainMenu(String option, String description, Supplier routeController) { this.option = option; this.description = description; + this.routeController = routeController; + } + + public static void execute(String selectedOption, Scanner scanner) { + Arrays.stream(values()) + .filter(mainMenu -> mainMenu.option.equals(selectedOption)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(OutputConstant.NOT_EXIST_OPTION_ERROR)) + .routeController + .get() + .mappingMenu(scanner); } @Override diff --git a/src/main/java/subway/views/OutputConstant.java b/src/main/java/subway/views/OutputConstant.java index 040c050d8..860da1a41 100644 --- a/src/main/java/subway/views/OutputConstant.java +++ b/src/main/java/subway/views/OutputConstant.java @@ -2,6 +2,7 @@ public class OutputConstant { public static final String OPTION_SEPARATOR = ". "; + public static final String NOT_EXIST_OPTION_ERROR = "[ERROR] 존재하지 않는 옵션입니다."; private OutputConstant() { } diff --git a/src/main/java/subway/views/mainviews/MainInputView.java b/src/main/java/subway/views/mainviews/MainInputView.java index ea2708734..c8eac3ad1 100644 --- a/src/main/java/subway/views/mainviews/MainInputView.java +++ b/src/main/java/subway/views/mainviews/MainInputView.java @@ -6,7 +6,7 @@ import java.util.Scanner; public class MainInputView implements InputView{ - public static String inputOption(Scanner scanner) { + public static String inputMainOption(Scanner scanner) { OutputView.printSelectOptionMessage(); return InputView.userInput(scanner); } diff --git a/src/main/java/subway/views/routeviews/RouteOutputView.java b/src/main/java/subway/views/routeviews/RouteOutputView.java index 58eb0a73e..2dd61707d 100644 --- a/src/main/java/subway/views/routeviews/RouteOutputView.java +++ b/src/main/java/subway/views/routeviews/RouteOutputView.java @@ -1,6 +1,7 @@ package subway.views.routeviews; import subway.domain.MainMenu; +import subway.domain.RouteMenu; import subway.views.OutputView; import java.util.Arrays; @@ -10,7 +11,7 @@ public class RouteOutputView implements OutputView { public static void printRouteMenu() { System.out.println(LINE_WRAP + ROUTE_SCREEN_MESSAGE); - Arrays.stream(MainMenu.values()) + Arrays.stream(RouteMenu.values()) .forEach(System.out::println); } } From 255864a422054cb25f2383bfd6f7345bbc3938fd Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 15:13:38 +0900 Subject: [PATCH 06/35] =?UTF-8?q?feat:=20=EA=B2=BD=EB=A1=9C=20=EA=B8=B0?= =?UTF-8?q?=EC=A4=80=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=B6=84?= =?UTF-8?q?=EA=B8=B0=ED=95=98=EB=8A=94=20=EA=B3=A8=EA=B2=A9=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/controller/RouteController.java | 22 ++++++++++++-- src/main/java/subway/domain/RouteMenu.java | 29 ++++++++++++++++--- .../subway/service/DistanceRouteService.java | 19 ++++++++++++ .../java/subway/service/RouteService.java | 7 +++++ .../java/subway/service/TimeRouteService.java | 19 ++++++++++++ src/main/java/subway/views/InputView.java | 11 ------- .../subway/views/mainviews/MainInputView.java | 5 ++-- .../views/routeviews/RouteInputView.java | 9 ++++-- 8 files changed, 99 insertions(+), 22 deletions(-) create mode 100644 src/main/java/subway/service/DistanceRouteService.java create mode 100644 src/main/java/subway/service/RouteService.java create mode 100644 src/main/java/subway/service/TimeRouteService.java delete mode 100644 src/main/java/subway/views/InputView.java diff --git a/src/main/java/subway/controller/RouteController.java b/src/main/java/subway/controller/RouteController.java index d1a5ef2c6..bea67c44c 100644 --- a/src/main/java/subway/controller/RouteController.java +++ b/src/main/java/subway/controller/RouteController.java @@ -1,10 +1,13 @@ package subway.controller; +import subway.domain.RouteMenu; +import subway.views.routeviews.RouteInputView; import subway.views.routeviews.RouteOutputView; import java.util.Scanner; public class RouteController { + private static final String GO_BACK_CODE = "B"; private static final RouteController routeController = new RouteController(); private RouteController() { @@ -14,7 +17,22 @@ public static RouteController getInstance() { return routeController; } - public void mappingMenu(Scanner scanner) { - RouteOutputView.printRouteMenu(); + public String mappingRouteMenu(Scanner scanner) { + try { + RouteOutputView.printRouteMenu(); + String selectedOption = RouteInputView.inputRouteOption(scanner); + branchBySelectedOption(selectedOption, scanner); + return selectedOption; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return mappingRouteMenu(scanner); + } + } + + private void branchBySelectedOption(String selectedOption, Scanner scanner) { + if (selectedOption.equals(GO_BACK_CODE)) { + return; + } + RouteMenu.execute(selectedOption, scanner); } } diff --git a/src/main/java/subway/domain/RouteMenu.java b/src/main/java/subway/domain/RouteMenu.java index dcc89e5b5..0e8650412 100644 --- a/src/main/java/subway/domain/RouteMenu.java +++ b/src/main/java/subway/domain/RouteMenu.java @@ -1,18 +1,39 @@ package subway.domain; +import subway.service.DistanceRouteService; +import subway.service.RouteService; +import subway.service.TimeRouteService; import subway.views.OutputConstant; +import java.util.Arrays; +import java.util.Scanner; +import java.util.function.Supplier; + public enum RouteMenu { - SHORTEST_DISTANCE("1", "최단 거리"), - SHORTEST_TIME("2", "최소 시간"), - GO_BACK_TO_MAIN_MENU("B", "돌아가기"); + SHORTEST_DISTANCE("1", "최단 거리", DistanceRouteService::getInstance), + SHORTEST_TIME("2", "최소 시간", TimeRouteService::getInstance), + GO_BACK_TO_MAIN_MENU("B", "돌아가기", () -> { + return null; + }); private final String option; private final String description; + private final Supplier routeService; - RouteMenu(String option, String description) { + RouteMenu(String option, String description, Supplier routeService) { this.option = option; this.description = description; + this.routeService = routeService; + } + + public static void execute(String selectedOption, Scanner scanner) { + Arrays.stream(values()) + .filter(routeMenu -> routeMenu.option.equals(selectedOption)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(OutputConstant.NOT_EXIST_OPTION_ERROR)) + .routeService + .get() + .routingService(scanner); } @Override diff --git a/src/main/java/subway/service/DistanceRouteService.java b/src/main/java/subway/service/DistanceRouteService.java new file mode 100644 index 000000000..dc8bf2ae5 --- /dev/null +++ b/src/main/java/subway/service/DistanceRouteService.java @@ -0,0 +1,19 @@ +package subway.service; + +import java.util.Scanner; + +public class DistanceRouteService implements RouteService { + private static final DistanceRouteService distanceRouteService = new DistanceRouteService(); + + private DistanceRouteService() { + } + + public static DistanceRouteService getInstance() { + return distanceRouteService; + } + + @Override + public void routingService(Scanner scanner) { + + } +} diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java new file mode 100644 index 000000000..2bb23f634 --- /dev/null +++ b/src/main/java/subway/service/RouteService.java @@ -0,0 +1,7 @@ +package subway.service; + +import java.util.Scanner; + +public interface RouteService { + void routingService(Scanner scanner); +} diff --git a/src/main/java/subway/service/TimeRouteService.java b/src/main/java/subway/service/TimeRouteService.java new file mode 100644 index 000000000..8c244366c --- /dev/null +++ b/src/main/java/subway/service/TimeRouteService.java @@ -0,0 +1,19 @@ +package subway.service; + +import java.util.Scanner; + +public class TimeRouteService implements RouteService { + private static final TimeRouteService timeRouteService = new TimeRouteService(); + + private TimeRouteService() { + } + + public static TimeRouteService getInstance() { + return timeRouteService; + } + + @Override + public void routingService(Scanner scanner) { + + } +} diff --git a/src/main/java/subway/views/InputView.java b/src/main/java/subway/views/InputView.java deleted file mode 100644 index f356c4737..000000000 --- a/src/main/java/subway/views/InputView.java +++ /dev/null @@ -1,11 +0,0 @@ -package subway.views; - -import java.util.Scanner; - -public interface InputView { - String LINE_WRAP = "\n"; - - static String userInput(Scanner scanner) { - return scanner.nextLine(); - } -} diff --git a/src/main/java/subway/views/mainviews/MainInputView.java b/src/main/java/subway/views/mainviews/MainInputView.java index c8eac3ad1..b0c9df625 100644 --- a/src/main/java/subway/views/mainviews/MainInputView.java +++ b/src/main/java/subway/views/mainviews/MainInputView.java @@ -1,13 +1,12 @@ package subway.views.mainviews; -import subway.views.InputView; import subway.views.OutputView; import java.util.Scanner; -public class MainInputView implements InputView{ +public class MainInputView { public static String inputMainOption(Scanner scanner) { OutputView.printSelectOptionMessage(); - return InputView.userInput(scanner); + return scanner.nextLine(); } } diff --git a/src/main/java/subway/views/routeviews/RouteInputView.java b/src/main/java/subway/views/routeviews/RouteInputView.java index 2a674216a..f8c3a7fab 100644 --- a/src/main/java/subway/views/routeviews/RouteInputView.java +++ b/src/main/java/subway/views/routeviews/RouteInputView.java @@ -1,7 +1,12 @@ package subway.views.routeviews; -import subway.views.InputView; +import subway.views.OutputView; -public class RouteInputView implements InputView { +import java.util.Scanner; +public class RouteInputView { + public static String inputRouteOption(Scanner scanner) { + OutputView.printSelectOptionMessage(); + return scanner.nextLine(); + } } From b6925ca683d27fb832926889434362adcba28f64 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 15:14:56 +0900 Subject: [PATCH 07/35] =?UTF-8?q?docs(README.md):=20=EB=A6=AC=EB=93=9C?= =?UTF-8?q?=EB=AF=B8=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 09bffc7ea..3c4783cb4 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,10 @@ - [] 경로를 조회할 기준을 출력하고 사용자의 선택을 입력받는다. - [x] 경로를 조회할 기준 메뉴를 출력한다. - - [] 1 을 입력받으면 최단 거리를 기준으로 경로를 조회한다. - - [] 2 를 입력받으면 최소 시간을 기준으로 경로를 조회한다. - - [] B 를 입력받으면 메인 메뉴로 돌아간다. - - [] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. + - [x] 1 을 입력받으면 최단 거리를 기준으로 경로를 조회한다. + - [x] 2 를 입력받으면 최소 시간을 기준으로 경로를 조회한다. + - [x] B 를 입력받으면 메인 메뉴로 돌아간다. + - [x] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. - [] 경로를 조회하는 기능에서는 출발역과 도착역을 설정한다. From c6c9dea700e65a9f9ba72901576b151eac733a91 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 15:15:42 +0900 Subject: [PATCH 08/35] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=EC=9D=84=20=EC=A4=80=EC=88=98=ED=95=98?= =?UTF-8?q?=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/subway/controller/MainController.java | 2 +- src/main/java/subway/domain/MainMenu.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/subway/controller/MainController.java b/src/main/java/subway/controller/MainController.java index 506a2404a..4eaebd387 100644 --- a/src/main/java/subway/controller/MainController.java +++ b/src/main/java/subway/controller/MainController.java @@ -21,7 +21,7 @@ public void run(Scanner scanner) { String selectedOption; do { selectedOption = mappingMainMenu(scanner); - } while(!selectedOption.equals(END_CODE)); + } while (!selectedOption.equals(END_CODE)); } private String mappingMainMenu(Scanner scanner) { diff --git a/src/main/java/subway/domain/MainMenu.java b/src/main/java/subway/domain/MainMenu.java index 4d800b82b..e2b135be2 100644 --- a/src/main/java/subway/domain/MainMenu.java +++ b/src/main/java/subway/domain/MainMenu.java @@ -9,7 +9,9 @@ public enum MainMenu { ROUTE_LOOKUP("1", "경로 조회", RouteController::getInstance), - EXIT_PROGRAM("Q", "종료", () -> {return null;}); + EXIT_PROGRAM("Q", "종료", () -> { + return null; + }); private final String option; private final String description; @@ -28,7 +30,7 @@ public static void execute(String selectedOption, Scanner scanner) { .orElseThrow(() -> new IllegalArgumentException(OutputConstant.NOT_EXIST_OPTION_ERROR)) .routeController .get() - .mappingMenu(scanner); + .mappingRouteMenu(scanner); } @Override From 0584e9bc2d6fb2837481776a2eb34bd5c4f13369 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 16:24:32 +0900 Subject: [PATCH 09/35] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=97=AD=EC=9D=98=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20=EA=B0=80=EC=A7=80=EB=8F=84=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Line.java | 5 ++- .../java/subway/domain/LineRepository.java | 26 ----------- src/main/java/subway/domain/LineStations.java | 11 +++++ src/main/java/subway/domain/MainMenu.java | 40 ----------------- src/main/java/subway/domain/RouteMenu.java | 43 ------------------- .../java/subway/domain/StationRepository.java | 26 ----------- 6 files changed, 15 insertions(+), 136 deletions(-) delete mode 100644 src/main/java/subway/domain/LineRepository.java create mode 100644 src/main/java/subway/domain/LineStations.java delete mode 100644 src/main/java/subway/domain/MainMenu.java delete mode 100644 src/main/java/subway/domain/RouteMenu.java delete mode 100644 src/main/java/subway/domain/StationRepository.java diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..c8fd9149b 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -2,6 +2,7 @@ public class Line { private String name; + private LineStations stations; public Line(String name) { this.name = name; @@ -11,5 +12,7 @@ public String getName() { return name; } - // 추가 기능 구현 + public void addLineStation(Station station) { + stations.addLineStation(station); + } } diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java deleted file mode 100644 index 2c4a723c9..000000000 --- a/src/main/java/subway/domain/LineRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package subway.domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class LineRepository { - private static final List lines = new ArrayList<>(); - - public static List lines() { - return Collections.unmodifiableList(lines); - } - - public static void addLine(Line line) { - lines.add(line); - } - - public static boolean deleteLineByName(String name) { - return lines.removeIf(line -> Objects.equals(line.getName(), name)); - } - - public static void deleteAll() { - lines.clear(); - } -} diff --git a/src/main/java/subway/domain/LineStations.java b/src/main/java/subway/domain/LineStations.java new file mode 100644 index 000000000..53dd02968 --- /dev/null +++ b/src/main/java/subway/domain/LineStations.java @@ -0,0 +1,11 @@ +package subway.domain; + +import java.util.List; + +public class LineStations { + private List stations; + + public void addLineStation(Station station) { + stations.add(station); + } +} diff --git a/src/main/java/subway/domain/MainMenu.java b/src/main/java/subway/domain/MainMenu.java deleted file mode 100644 index e2b135be2..000000000 --- a/src/main/java/subway/domain/MainMenu.java +++ /dev/null @@ -1,40 +0,0 @@ -package subway.domain; - -import subway.controller.RouteController; -import subway.views.OutputConstant; - -import java.util.Arrays; -import java.util.Scanner; -import java.util.function.Supplier; - -public enum MainMenu { - ROUTE_LOOKUP("1", "경로 조회", RouteController::getInstance), - EXIT_PROGRAM("Q", "종료", () -> { - return null; - }); - - private final String option; - private final String description; - private final Supplier routeController; - - MainMenu(String option, String description, Supplier routeController) { - this.option = option; - this.description = description; - this.routeController = routeController; - } - - public static void execute(String selectedOption, Scanner scanner) { - Arrays.stream(values()) - .filter(mainMenu -> mainMenu.option.equals(selectedOption)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(OutputConstant.NOT_EXIST_OPTION_ERROR)) - .routeController - .get() - .mappingRouteMenu(scanner); - } - - @Override - public String toString() { - return option + OutputConstant.OPTION_SEPARATOR + description; - } -} diff --git a/src/main/java/subway/domain/RouteMenu.java b/src/main/java/subway/domain/RouteMenu.java deleted file mode 100644 index 0e8650412..000000000 --- a/src/main/java/subway/domain/RouteMenu.java +++ /dev/null @@ -1,43 +0,0 @@ -package subway.domain; - -import subway.service.DistanceRouteService; -import subway.service.RouteService; -import subway.service.TimeRouteService; -import subway.views.OutputConstant; - -import java.util.Arrays; -import java.util.Scanner; -import java.util.function.Supplier; - -public enum RouteMenu { - SHORTEST_DISTANCE("1", "최단 거리", DistanceRouteService::getInstance), - SHORTEST_TIME("2", "최소 시간", TimeRouteService::getInstance), - GO_BACK_TO_MAIN_MENU("B", "돌아가기", () -> { - return null; - }); - - private final String option; - private final String description; - private final Supplier routeService; - - RouteMenu(String option, String description, Supplier routeService) { - this.option = option; - this.description = description; - this.routeService = routeService; - } - - public static void execute(String selectedOption, Scanner scanner) { - Arrays.stream(values()) - .filter(routeMenu -> routeMenu.option.equals(selectedOption)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(OutputConstant.NOT_EXIST_OPTION_ERROR)) - .routeService - .get() - .routingService(scanner); - } - - @Override - public String toString() { - return option + OutputConstant.OPTION_SEPARATOR + description; - } -} diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java deleted file mode 100644 index 8ed9d103f..000000000 --- a/src/main/java/subway/domain/StationRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package subway.domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class StationRepository { - private static final List stations = new ArrayList<>(); - - public static List stations() { - return Collections.unmodifiableList(stations); - } - - public static void addStation(Station station) { - stations.add(station); - } - - public static boolean deleteStation(String name) { - return stations.removeIf(station -> Objects.equals(station.getName(), name)); - } - - public static void deleteAll() { - stations.clear(); - } -} From 439cb4678ab7c7bfb52319dc976d01ec73eec7c9 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 16:25:47 +0900 Subject: [PATCH 10/35] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=EC=9D=98=20=EA=B1=B0=EB=A6=AC=EC=99=80=20=EC=86=8C=EC=9A=94?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=9D=84=20section=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Distance.java | 9 +++++++++ .../java/subway/domain/RequiredResources.java | 11 +++++++++++ src/main/java/subway/domain/Section.java | 11 +++++++++++ src/main/java/subway/domain/Time.java | 9 +++++++++ .../subway/repository/SectionRepository.java | 18 ++++++++++++++++++ 5 files changed, 58 insertions(+) create mode 100644 src/main/java/subway/domain/Distance.java create mode 100644 src/main/java/subway/domain/RequiredResources.java create mode 100644 src/main/java/subway/domain/Section.java create mode 100644 src/main/java/subway/domain/Time.java create mode 100644 src/main/java/subway/repository/SectionRepository.java diff --git a/src/main/java/subway/domain/Distance.java b/src/main/java/subway/domain/Distance.java new file mode 100644 index 000000000..b036ea9a8 --- /dev/null +++ b/src/main/java/subway/domain/Distance.java @@ -0,0 +1,9 @@ +package subway.domain; + +public class Distance { + private int distance; + + public Distance(int distance) { + this.distance = distance; + } +} diff --git a/src/main/java/subway/domain/RequiredResources.java b/src/main/java/subway/domain/RequiredResources.java new file mode 100644 index 000000000..3e9c37d5b --- /dev/null +++ b/src/main/java/subway/domain/RequiredResources.java @@ -0,0 +1,11 @@ +package subway.domain; + +public class RequiredResources { + private final Distance distance; + private final Time time; + + public RequiredResources(int distance, int time) { + this.distance = new Distance(distance); + this.time = new Time(time); + } +} diff --git a/src/main/java/subway/domain/Section.java b/src/main/java/subway/domain/Section.java new file mode 100644 index 000000000..c3d2f1790 --- /dev/null +++ b/src/main/java/subway/domain/Section.java @@ -0,0 +1,11 @@ +package subway.domain; + +public class Section { + private final Station firstStation; + private final Station secondStation; + + public Section(Station firstStation, Station secondStation) { + this.firstStation = firstStation; + this.secondStation = secondStation; + } +} diff --git a/src/main/java/subway/domain/Time.java b/src/main/java/subway/domain/Time.java new file mode 100644 index 000000000..6f5d6f040 --- /dev/null +++ b/src/main/java/subway/domain/Time.java @@ -0,0 +1,9 @@ +package subway.domain; + +public class Time { + private int time; + + public Time(int time) { + this.time = time; + } +} diff --git a/src/main/java/subway/repository/SectionRepository.java b/src/main/java/subway/repository/SectionRepository.java new file mode 100644 index 000000000..f52c55929 --- /dev/null +++ b/src/main/java/subway/repository/SectionRepository.java @@ -0,0 +1,18 @@ +package subway.repository; + +import subway.domain.RequiredResources; +import subway.domain.Section; + +import java.util.*; + +public class SectionRepository { + private static Map sections = new HashMap<>(); + + public static Map sections() { + return Collections.unmodifiableMap(sections); + } + + public static void addSection(Section section, RequiredResources requiredResources) { + sections.put(section, requiredResources); + } +} From 3c6418bb50723f37775d2179b5a51bfea0a19632 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 16:26:33 +0900 Subject: [PATCH 11/35] =?UTF-8?q?style:=20repository,=20controller,=20menu?= =?UTF-8?q?=EB=B3=84=EB=A1=9C=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/controller/MainController.java | 2 +- .../subway/controller/RouteController.java | 2 +- src/main/java/subway/menus/MainMenu.java | 40 +++++++++++++++++ src/main/java/subway/menus/RouteMenu.java | 43 +++++++++++++++++++ .../subway/repository/LineRepository.java | 28 ++++++++++++ .../subway/repository/StationRepository.java | 28 ++++++++++++ 6 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 src/main/java/subway/menus/MainMenu.java create mode 100644 src/main/java/subway/menus/RouteMenu.java create mode 100644 src/main/java/subway/repository/LineRepository.java create mode 100644 src/main/java/subway/repository/StationRepository.java diff --git a/src/main/java/subway/controller/MainController.java b/src/main/java/subway/controller/MainController.java index 4eaebd387..ad2f6eeaa 100644 --- a/src/main/java/subway/controller/MainController.java +++ b/src/main/java/subway/controller/MainController.java @@ -1,6 +1,6 @@ package subway.controller; -import subway.domain.MainMenu; +import subway.menus.MainMenu; import subway.views.mainviews.MainInputView; import subway.views.mainviews.MainOutputView; diff --git a/src/main/java/subway/controller/RouteController.java b/src/main/java/subway/controller/RouteController.java index bea67c44c..1c4ec0b8a 100644 --- a/src/main/java/subway/controller/RouteController.java +++ b/src/main/java/subway/controller/RouteController.java @@ -1,6 +1,6 @@ package subway.controller; -import subway.domain.RouteMenu; +import subway.menus.RouteMenu; import subway.views.routeviews.RouteInputView; import subway.views.routeviews.RouteOutputView; diff --git a/src/main/java/subway/menus/MainMenu.java b/src/main/java/subway/menus/MainMenu.java new file mode 100644 index 000000000..df5d78cc0 --- /dev/null +++ b/src/main/java/subway/menus/MainMenu.java @@ -0,0 +1,40 @@ +package subway.menus; + +import subway.controller.RouteController; +import subway.views.OutputConstant; + +import java.util.Arrays; +import java.util.Scanner; +import java.util.function.Supplier; + +public enum MainMenu { + ROUTE_LOOKUP("1", "경로 조회", RouteController::getInstance), + EXIT_PROGRAM("Q", "종료", () -> { + return null; + }); + + private final String option; + private final String description; + private final Supplier routeController; + + MainMenu(String option, String description, Supplier routeController) { + this.option = option; + this.description = description; + this.routeController = routeController; + } + + public static void execute(String selectedOption, Scanner scanner) { + Arrays.stream(values()) + .filter(mainMenu -> mainMenu.option.equals(selectedOption)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(OutputConstant.NOT_EXIST_OPTION_ERROR)) + .routeController + .get() + .mappingRouteMenu(scanner); + } + + @Override + public String toString() { + return option + OutputConstant.OPTION_SEPARATOR + description; + } +} diff --git a/src/main/java/subway/menus/RouteMenu.java b/src/main/java/subway/menus/RouteMenu.java new file mode 100644 index 000000000..ca430aa20 --- /dev/null +++ b/src/main/java/subway/menus/RouteMenu.java @@ -0,0 +1,43 @@ +package subway.menus; + +import subway.service.DistanceRouteService; +import subway.service.RouteService; +import subway.service.TimeRouteService; +import subway.views.OutputConstant; + +import java.util.Arrays; +import java.util.Scanner; +import java.util.function.Supplier; + +public enum RouteMenu { + SHORTEST_DISTANCE("1", "최단 거리", DistanceRouteService::getInstance), + SHORTEST_TIME("2", "최소 시간", TimeRouteService::getInstance), + GO_BACK_TO_MAIN_MENU("B", "돌아가기", () -> { + return null; + }); + + private final String option; + private final String description; + private final Supplier routeService; + + RouteMenu(String option, String description, Supplier routeService) { + this.option = option; + this.description = description; + this.routeService = routeService; + } + + public static void execute(String selectedOption, Scanner scanner) { + Arrays.stream(values()) + .filter(routeMenu -> routeMenu.option.equals(selectedOption)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(OutputConstant.NOT_EXIST_OPTION_ERROR)) + .routeService + .get() + .routingService(scanner); + } + + @Override + public String toString() { + return option + OutputConstant.OPTION_SEPARATOR + description; + } +} diff --git a/src/main/java/subway/repository/LineRepository.java b/src/main/java/subway/repository/LineRepository.java new file mode 100644 index 000000000..84101c3e0 --- /dev/null +++ b/src/main/java/subway/repository/LineRepository.java @@ -0,0 +1,28 @@ +package subway.repository; + +import subway.domain.Line; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class LineRepository { + private static final List lines = new ArrayList<>(); + + public static List lines() { + return Collections.unmodifiableList(lines); + } + + public static void addLine(Line line) { + lines.add(line); + } + + public static boolean deleteLineByName(String name) { + return lines.removeIf(line -> Objects.equals(line.getName(), name)); + } + + public static void deleteAll() { + lines.clear(); + } +} diff --git a/src/main/java/subway/repository/StationRepository.java b/src/main/java/subway/repository/StationRepository.java new file mode 100644 index 000000000..5fbadba4a --- /dev/null +++ b/src/main/java/subway/repository/StationRepository.java @@ -0,0 +1,28 @@ +package subway.repository; + +import subway.domain.Station; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class StationRepository { + private static final List stations = new ArrayList<>(); + + public static List stations() { + return Collections.unmodifiableList(stations); + } + + public static void addStation(Station station) { + stations.add(station); + } + + public static boolean deleteStation(String name) { + return stations.removeIf(station -> Objects.equals(station.getName(), name)); + } + + public static void deleteAll() { + stations.clear(); + } +} From 077f79aacad484f1f74f8d04dec03d79364450fc Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 16:28:43 +0900 Subject: [PATCH 12/35] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EB=9E=A8=20=EC=8B=9C=EC=9E=91=20=EC=8B=9C=20=EC=97=AD,=20?= =?UTF-8?q?=EB=85=B8=EC=84=A0,=20section=20=EC=A0=95=EB=B3=B4=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- src/main/java/subway/InitialSetting.java | 83 +++++++++++++++++++ .../views/mainviews/MainOutputView.java | 2 +- .../views/routeviews/RouteOutputView.java | 3 +- 4 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 src/main/java/subway/InitialSetting.java diff --git a/README.md b/README.md index 3c4783cb4..6341b76f1 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ ## 기능 목록 - - [] 프로그램 시작 시 역, 노선, 구간 정보를 초기 설정한다. + - [x] 프로그램 시작 시 역, 노선, 구간 정보를 초기 설정한다. - - [] 메인 메뉴를 출력하고 사용자의 선택을 입력을 받는다. + - [x] 메인 메뉴를 출력하고 사용자의 선택을 입력을 받는다. - [x] 메인 메뉴를 출력한다. - [x] 사용자의 입력을 받는다. @@ -14,7 +14,7 @@ - [x] Q 를 입력받으면 프로그램을 종료한다. - [x] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. - - [] 경로를 조회할 기준을 출력하고 사용자의 선택을 입력받는다. + - [x] 경로를 조회할 기준을 출력하고 사용자의 선택을 입력받는다. - [x] 경로를 조회할 기준 메뉴를 출력한다. - [x] 1 을 입력받으면 최단 거리를 기준으로 경로를 조회한다. diff --git a/src/main/java/subway/InitialSetting.java b/src/main/java/subway/InitialSetting.java new file mode 100644 index 000000000..db0f9b2dc --- /dev/null +++ b/src/main/java/subway/InitialSetting.java @@ -0,0 +1,83 @@ +package subway; + +import subway.domain.Line; +import subway.domain.RequiredResources; +import subway.domain.Section; +import subway.domain.Station; +import subway.repository.LineRepository; +import subway.repository.SectionRepository; +import subway.repository.StationRepository; + +public class InitialSetting { + private static final String GYODAE = "교대역"; + private static final String GANGNAM = "강남역"; + private static final String YUCKSAM = "역삼역"; + private static final String NAMBUTERMINAL = "남부터미널역"; + private static final String YANGGAE = "양재역"; + private static final String YANGGAEFORREST = "양재시민의숲역"; + private static final String MAEBONG = "매봉역"; + private static final String LINE_TWO = "2호선"; + private static final String LINE_THREE = "3호선"; + private static final String LINE_SINBUNDANG = "신분당선"; + private static final String[] LINE_TWO_STATIONS = {"교대역", "강남역", "역삼역"}; + private static final String[] LINE_THREE_STATIONS = {"교대역", "남부터미널역", "양재역", "매봉역"}; + private static final String[] LINE_SINBUNDANG_STATIONS = {"강남역", "양재역", "양재시민의숲역"}; + + public static void settingInitialSubways() { + StationRepository.deleteAll(); + LineRepository.deleteAll(); + settingInitialStations(); + + settingInitialLines(LINE_TWO, LINE_TWO_STATIONS); + settingInitialLines(LINE_THREE, LINE_THREE_STATIONS); + settingInitialLines(LINE_SINBUNDANG, LINE_SINBUNDANG_STATIONS); + + settingInitialSection(); + } + + private static void settingInitialStations() { + StationRepository.addStation(new Station(GYODAE)); + StationRepository.addStation(new Station(GANGNAM)); + StationRepository.addStation(new Station(YUCKSAM)); + StationRepository.addStation(new Station(NAMBUTERMINAL)); + StationRepository.addStation(new Station(YANGGAE)); + StationRepository.addStation(new Station(YANGGAEFORREST)); + StationRepository.addStation(new Station(MAEBONG)); + } + + private static void settingInitialLines(String lineName, String[] stationNames) { + Line line = new Line(lineName); + addStationInLine(line, stationNames); + LineRepository.addLine(line); + } + + private static void addStationInLine(Line line, String[] stationNames) { + for (String stationName : stationNames) { + line.addLineStation(new Station(stationName)); + } + } + + private static void settingInitialSection() { + Section section = new Section(new Station(GYODAE), new Station(GANGNAM)); + RequiredResources requiredResources = new RequiredResources(2, 3); + SectionRepository.addSection(section, requiredResources); + section = new Section(new Station(GANGNAM), new Station(YUCKSAM)); + requiredResources = new RequiredResources(2, 3); + SectionRepository.addSection(section, requiredResources); + section = new Section(new Station(GYODAE), new Station(NAMBUTERMINAL)); + requiredResources = new RequiredResources(3, 2); + SectionRepository.addSection(section, requiredResources); + section = new Section(new Station(NAMBUTERMINAL), new Station(YANGGAE)); + requiredResources = new RequiredResources(6, 5); + SectionRepository.addSection(section, requiredResources); + section = new Section(new Station(YANGGAE), new Station(MAEBONG)); + requiredResources = new RequiredResources(1, 1); + SectionRepository.addSection(section, requiredResources); + section = new Section(new Station(GANGNAM), new Station(YANGGAE)); + requiredResources = new RequiredResources(2, 8); + SectionRepository.addSection(section, requiredResources); + section = new Section(new Station(YANGGAE), new Station(YANGGAEFORREST)); + requiredResources = new RequiredResources(10, 3); + SectionRepository.addSection(section, requiredResources); + } +} diff --git a/src/main/java/subway/views/mainviews/MainOutputView.java b/src/main/java/subway/views/mainviews/MainOutputView.java index be3feaca4..ddda750e9 100644 --- a/src/main/java/subway/views/mainviews/MainOutputView.java +++ b/src/main/java/subway/views/mainviews/MainOutputView.java @@ -1,6 +1,6 @@ package subway.views.mainviews; -import subway.domain.MainMenu; +import subway.menus.MainMenu; import subway.views.OutputView; import java.util.Arrays; diff --git a/src/main/java/subway/views/routeviews/RouteOutputView.java b/src/main/java/subway/views/routeviews/RouteOutputView.java index 2dd61707d..a9fa10719 100644 --- a/src/main/java/subway/views/routeviews/RouteOutputView.java +++ b/src/main/java/subway/views/routeviews/RouteOutputView.java @@ -1,7 +1,6 @@ package subway.views.routeviews; -import subway.domain.MainMenu; -import subway.domain.RouteMenu; +import subway.menus.RouteMenu; import subway.views.OutputView; import java.util.Arrays; From 13f41a2a301cbc58102456a6061101853c45281b Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 17:01:49 +0900 Subject: [PATCH 13/35] =?UTF-8?q?feat:=20=EC=B6=9C=EB=B0=9C=EC=97=AD?= =?UTF-8?q?=EA=B3=BC=20=EB=8F=84=EC=B0=A9=EC=97=AD=EC=9D=84=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EB=B0=9B=EA=B3=A0=20=EC=98=88=EC=99=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++---- .../subway/service/DistanceRouteService.java | 27 +++++++++++++++++++ .../java/subway/service/RouteService.java | 8 ++++++ .../views/routeviews/RouteInputView.java | 10 +++++++ .../views/routeviews/RouteOutputView.java | 10 +++++++ 5 files changed, 60 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6341b76f1..47d16d64b 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,12 @@ - [x] B 를 입력받으면 메인 메뉴로 돌아간다. - [x] [예외 처리] 메뉴에 없는 값을 입력받으면 에러를 출력한다. - - [] 경로를 조회하는 기능에서는 출발역과 도착역을 설정한다. + - [x] 경로를 조회하는 기능에서는 출발역과 도착역을 설정한다. - - [] 출발역을 입력받는다. - - [] 도착역을 입력받는다. - - [] [예외 처리] 등록되지 않은 역을 입력받으면 에러를 출력한다. - - [] [예외 처리] 입력받은 출발역과 도착역이 같으면 에러를 출력한다. + - [x] 출발역을 입력받는다. + - [x] 도착역을 입력받는다. + - [x] [예외 처리] 등록되지 않은 역을 입력받으면 에러를 출력한다. + - [x] [예외 처리] 입력받은 출발역과 도착역이 같으면 에러를 출력한다. - [] 출발역에서 도착역까지 가는 최단 경로를 구한다. diff --git a/src/main/java/subway/service/DistanceRouteService.java b/src/main/java/subway/service/DistanceRouteService.java index dc8bf2ae5..b3f8cea5f 100644 --- a/src/main/java/subway/service/DistanceRouteService.java +++ b/src/main/java/subway/service/DistanceRouteService.java @@ -1,8 +1,14 @@ package subway.service; +import subway.domain.Station; +import subway.repository.StationRepository; +import subway.views.routeviews.RouteInputView; + import java.util.Scanner; public class DistanceRouteService implements RouteService { + private static final String NOT_EXIST_STATION_ERROR = "[ERROR} 존재하지 않는 역입니다."; + private static final String SAME_STATION_ERROR = "[ERROR] 같은 역은 입력할 수 없습니다."; private static final DistanceRouteService distanceRouteService = new DistanceRouteService(); private DistanceRouteService() { @@ -14,6 +20,27 @@ public static DistanceRouteService getInstance() { @Override public void routingService(Scanner scanner) { + try { + Station startStation = new Station(RouteInputView.inputStartStation(scanner)); + isExistStation(startStation); + Station endStation = new Station(RouteInputView.inputEndStation(scanner)); + isExistStation(endStation); + isSameName(startStation, endStation); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + goToMenu(e, scanner); + } + } + + private void isExistStation(Station station) { + if (!StationRepository.stations().contains(station)) { + throw new IllegalArgumentException(NOT_EXIST_STATION_ERROR); + } + } + private void isSameName(Station startStation, Station endStation) { + if (startStation.getName().equals(endStation.getName())) { + throw new IllegalArgumentException(SAME_STATION_ERROR); + } } } diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index 2bb23f634..dec8192f3 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -1,7 +1,15 @@ package subway.service; +import subway.controller.RouteController; + import java.util.Scanner; public interface RouteService { void routingService(Scanner scanner); + + default void goToMenu(IllegalArgumentException e, Scanner scanner) { + System.out.println(e.getMessage()); + RouteController routeController = RouteController.getInstance(); + routeController.mappingRouteMenu(scanner); + } } diff --git a/src/main/java/subway/views/routeviews/RouteInputView.java b/src/main/java/subway/views/routeviews/RouteInputView.java index f8c3a7fab..bc7cedad6 100644 --- a/src/main/java/subway/views/routeviews/RouteInputView.java +++ b/src/main/java/subway/views/routeviews/RouteInputView.java @@ -9,4 +9,14 @@ public static String inputRouteOption(Scanner scanner) { OutputView.printSelectOptionMessage(); return scanner.nextLine(); } + + public static String inputStartStation(Scanner scanner) { + RouteOutputView.printStartStationMessage(); + return scanner.nextLine(); + } + + public static String inputEndStation(Scanner scanner) { + RouteOutputView.printEndStationMessage(); + return scanner.nextLine(); + } } diff --git a/src/main/java/subway/views/routeviews/RouteOutputView.java b/src/main/java/subway/views/routeviews/RouteOutputView.java index a9fa10719..f916beefa 100644 --- a/src/main/java/subway/views/routeviews/RouteOutputView.java +++ b/src/main/java/subway/views/routeviews/RouteOutputView.java @@ -7,10 +7,20 @@ public class RouteOutputView implements OutputView { private static final String ROUTE_SCREEN_MESSAGE = "## 경로 기준"; + private static final String INPUT_START_STATION_MESSAGE = "## 출발역을 입력하세요."; + private static final String INPUT_END_STATION_MESSAGE = "## 도착역을 입력하세요."; public static void printRouteMenu() { System.out.println(LINE_WRAP + ROUTE_SCREEN_MESSAGE); Arrays.stream(RouteMenu.values()) .forEach(System.out::println); } + + public static void printStartStationMessage() { + System.out.println(LINE_WRAP + INPUT_START_STATION_MESSAGE); + } + + public static void printEndStationMessage() { + System.out.println(LINE_WRAP + INPUT_END_STATION_MESSAGE); + } } From 815992a8ca749494818914c60858221ea5c92e4c Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 17:02:11 +0900 Subject: [PATCH 14/35] =?UTF-8?q?fix:=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=88=84=EB=9D=BD=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/subway/InitialSetting.java | 1 + src/main/java/subway/domain/Line.java | 4 ++++ src/main/java/subway/domain/LineStations.java | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/src/main/java/subway/InitialSetting.java b/src/main/java/subway/InitialSetting.java index db0f9b2dc..a55b257a7 100644 --- a/src/main/java/subway/InitialSetting.java +++ b/src/main/java/subway/InitialSetting.java @@ -26,6 +26,7 @@ public class InitialSetting { public static void settingInitialSubways() { StationRepository.deleteAll(); LineRepository.deleteAll(); + settingInitialStations(); settingInitialLines(LINE_TWO, LINE_TWO_STATIONS); diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index c8fd9149b..ff0c58d80 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,11 +1,15 @@ package subway.domain; +import java.util.ArrayList; +import java.util.List; + public class Line { private String name; private LineStations stations; public Line(String name) { this.name = name; + this.stations = new LineStations(); } public String getName() { diff --git a/src/main/java/subway/domain/LineStations.java b/src/main/java/subway/domain/LineStations.java index 53dd02968..d446dd321 100644 --- a/src/main/java/subway/domain/LineStations.java +++ b/src/main/java/subway/domain/LineStations.java @@ -1,10 +1,15 @@ package subway.domain; +import java.util.ArrayList; import java.util.List; public class LineStations { private List stations; + public LineStations() { + this.stations = new ArrayList<>(); + } + public void addLineStation(Station station) { stations.add(station); } From d43980d0ddb98197bf72bf5e2b7ef1a10a07ea89 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 17:04:36 +0900 Subject: [PATCH 15/35] =?UTF-8?q?refactor:=20=EC=84=9C=EB=B9=84=EC=8A=A4?= =?UTF-8?q?=20=EA=B3=B5=ED=86=B5=EB=B6=80=EB=B6=84=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/service/DistanceRouteService.java | 21 ++------------- .../java/subway/service/RouteService.java | 26 +++++++++++++++++++ .../java/subway/service/TimeRouteService.java | 7 ++++- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/main/java/subway/service/DistanceRouteService.java b/src/main/java/subway/service/DistanceRouteService.java index b3f8cea5f..1aee9f369 100644 --- a/src/main/java/subway/service/DistanceRouteService.java +++ b/src/main/java/subway/service/DistanceRouteService.java @@ -7,8 +7,7 @@ import java.util.Scanner; public class DistanceRouteService implements RouteService { - private static final String NOT_EXIST_STATION_ERROR = "[ERROR} 존재하지 않는 역입니다."; - private static final String SAME_STATION_ERROR = "[ERROR] 같은 역은 입력할 수 없습니다."; + private static final DistanceRouteService distanceRouteService = new DistanceRouteService(); private DistanceRouteService() { @@ -21,26 +20,10 @@ public static DistanceRouteService getInstance() { @Override public void routingService(Scanner scanner) { try { - Station startStation = new Station(RouteInputView.inputStartStation(scanner)); - isExistStation(startStation); - Station endStation = new Station(RouteInputView.inputEndStation(scanner)); - isExistStation(endStation); - isSameName(startStation, endStation); + inputStations(scanner); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); goToMenu(e, scanner); } } - - private void isExistStation(Station station) { - if (!StationRepository.stations().contains(station)) { - throw new IllegalArgumentException(NOT_EXIST_STATION_ERROR); - } - } - - private void isSameName(Station startStation, Station endStation) { - if (startStation.getName().equals(endStation.getName())) { - throw new IllegalArgumentException(SAME_STATION_ERROR); - } - } } diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index dec8192f3..5c12f871d 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -1,15 +1,41 @@ package subway.service; import subway.controller.RouteController; +import subway.domain.Station; +import subway.repository.StationRepository; +import subway.views.routeviews.RouteInputView; import java.util.Scanner; public interface RouteService { + String NOT_EXIST_STATION_ERROR = "[ERROR} 존재하지 않는 역입니다."; + String SAME_STATION_ERROR = "[ERROR] 같은 역은 입력할 수 없습니다."; + void routingService(Scanner scanner); + default void inputStations(Scanner scanner) { + Station startStation = new Station(RouteInputView.inputStartStation(scanner)); + isExistStation(startStation); + Station endStation = new Station(RouteInputView.inputEndStation(scanner)); + isExistStation(endStation); + isSameName(startStation, endStation); + } + default void goToMenu(IllegalArgumentException e, Scanner scanner) { System.out.println(e.getMessage()); RouteController routeController = RouteController.getInstance(); routeController.mappingRouteMenu(scanner); } + + static void isExistStation(Station station) { + if (!StationRepository.stations().contains(station)) { + throw new IllegalArgumentException(NOT_EXIST_STATION_ERROR); + } + } + + static void isSameName(Station startStation, Station endStation) { + if (startStation.getName().equals(endStation.getName())) { + throw new IllegalArgumentException(SAME_STATION_ERROR); + } + } } diff --git a/src/main/java/subway/service/TimeRouteService.java b/src/main/java/subway/service/TimeRouteService.java index 8c244366c..cbb426bc5 100644 --- a/src/main/java/subway/service/TimeRouteService.java +++ b/src/main/java/subway/service/TimeRouteService.java @@ -14,6 +14,11 @@ public static TimeRouteService getInstance() { @Override public void routingService(Scanner scanner) { - + try { + inputStations(scanner); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + goToMenu(e, scanner); + } } } From 12a41b74f71b38d603336a6d772c345ce5dbbf3b Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 17:10:50 +0900 Subject: [PATCH 16/35] =?UTF-8?q?fix:=20=EC=97=90=EB=9F=AC=EA=B0=80=20?= =?UTF-8?q?=EB=91=90=EB=B2=88=20=EC=B6=9C=EB=A0=A5=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=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/subway/service/DistanceRouteService.java | 1 - src/main/java/subway/service/TimeRouteService.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/subway/service/DistanceRouteService.java b/src/main/java/subway/service/DistanceRouteService.java index 1aee9f369..9ae29ad4b 100644 --- a/src/main/java/subway/service/DistanceRouteService.java +++ b/src/main/java/subway/service/DistanceRouteService.java @@ -22,7 +22,6 @@ public void routingService(Scanner scanner) { try { inputStations(scanner); } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); goToMenu(e, scanner); } } diff --git a/src/main/java/subway/service/TimeRouteService.java b/src/main/java/subway/service/TimeRouteService.java index cbb426bc5..2b8c7cde0 100644 --- a/src/main/java/subway/service/TimeRouteService.java +++ b/src/main/java/subway/service/TimeRouteService.java @@ -17,7 +17,6 @@ public void routingService(Scanner scanner) { try { inputStations(scanner); } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); goToMenu(e, scanner); } } From 004704dbc11f6b0d1f00a0968e3969c1670d1f07 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 17:15:32 +0900 Subject: [PATCH 17/35] =?UTF-8?q?refactor:=20=EC=B6=9C=EB=B0=9C=EC=97=AD?= =?UTF-8?q?=EC=9D=84=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8A=94=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=EA=B3=BC=20=EB=8F=84=EC=B0=A9=EC=97=AD=EC=9D=84=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8A=94=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=EC=9D=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/service/DistanceRouteService.java | 6 +++--- src/main/java/subway/service/RouteService.java | 8 ++++++-- src/main/java/subway/service/TimeRouteService.java | 6 +++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/subway/service/DistanceRouteService.java b/src/main/java/subway/service/DistanceRouteService.java index 9ae29ad4b..3d9dfbd29 100644 --- a/src/main/java/subway/service/DistanceRouteService.java +++ b/src/main/java/subway/service/DistanceRouteService.java @@ -1,8 +1,6 @@ package subway.service; import subway.domain.Station; -import subway.repository.StationRepository; -import subway.views.routeviews.RouteInputView; import java.util.Scanner; @@ -20,7 +18,9 @@ public static DistanceRouteService getInstance() { @Override public void routingService(Scanner scanner) { try { - inputStations(scanner); + Station startStation = inputStartStations(scanner); + Station endStation = inputEndStation(scanner); + RouteService.isSameName(startStation, endStation); } catch (IllegalArgumentException e) { goToMenu(e, scanner); } diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index 5c12f871d..c991866e7 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -13,12 +13,16 @@ public interface RouteService { void routingService(Scanner scanner); - default void inputStations(Scanner scanner) { + default Station inputStartStations(Scanner scanner) { Station startStation = new Station(RouteInputView.inputStartStation(scanner)); isExistStation(startStation); + return startStation; + } + + default Station inputEndStation(Scanner scanner) { Station endStation = new Station(RouteInputView.inputEndStation(scanner)); isExistStation(endStation); - isSameName(startStation, endStation); + return endStation; } default void goToMenu(IllegalArgumentException e, Scanner scanner) { diff --git a/src/main/java/subway/service/TimeRouteService.java b/src/main/java/subway/service/TimeRouteService.java index 2b8c7cde0..4f8b4c204 100644 --- a/src/main/java/subway/service/TimeRouteService.java +++ b/src/main/java/subway/service/TimeRouteService.java @@ -1,5 +1,7 @@ package subway.service; +import subway.domain.Station; + import java.util.Scanner; public class TimeRouteService implements RouteService { @@ -15,7 +17,9 @@ public static TimeRouteService getInstance() { @Override public void routingService(Scanner scanner) { try { - inputStations(scanner); + Station startStation = inputStartStations(scanner); + Station endStation = inputEndStation(scanner); + RouteService.isSameName(startStation, endStation); } catch (IllegalArgumentException e) { goToMenu(e, scanner); } From d90093c207996776eceac0aafa65497fde6ceeeb Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 17:40:38 +0900 Subject: [PATCH 18/35] =?UTF-8?q?feat:=20=EB=91=90=20=EC=97=AD=EC=9D=B4=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0=EB=90=98=EC=96=B4=20=EC=9E=88=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=9C=BC=EB=A9=B4=20=EC=98=88=EC=99=B8=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Line.java | 11 ++++++----- src/main/java/subway/domain/LineStations.java | 9 ++++++++- .../java/subway/repository/LineRepository.java | 18 ++++++++++++++++++ .../subway/service/DistanceRouteService.java | 1 + src/main/java/subway/service/RouteService.java | 9 +++++++++ .../java/subway/service/TimeRouteService.java | 1 + 6 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index ff0c58d80..6b7ce6b4b 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,11 +1,8 @@ package subway.domain; -import java.util.ArrayList; -import java.util.List; - public class Line { - private String name; - private LineStations stations; + private final String name; + private final LineStations stations; public Line(String name) { this.name = name; @@ -19,4 +16,8 @@ public String getName() { public void addLineStation(Station station) { stations.addLineStation(station); } + + public Boolean isStationContained(Station station) { + return stations.isContain(station); + } } diff --git a/src/main/java/subway/domain/LineStations.java b/src/main/java/subway/domain/LineStations.java index d446dd321..78e073213 100644 --- a/src/main/java/subway/domain/LineStations.java +++ b/src/main/java/subway/domain/LineStations.java @@ -4,7 +4,7 @@ import java.util.List; public class LineStations { - private List stations; + private final List stations; public LineStations() { this.stations = new ArrayList<>(); @@ -13,4 +13,11 @@ public LineStations() { public void addLineStation(Station station) { stations.add(station); } + + public Boolean isContain(Station station) { + if (stations.contains(station)) { + return true; + } + return false; + } } diff --git a/src/main/java/subway/repository/LineRepository.java b/src/main/java/subway/repository/LineRepository.java index 84101c3e0..d64e00085 100644 --- a/src/main/java/subway/repository/LineRepository.java +++ b/src/main/java/subway/repository/LineRepository.java @@ -1,11 +1,13 @@ package subway.repository; import subway.domain.Line; +import subway.domain.Station; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; public class LineRepository { private static final List lines = new ArrayList<>(); @@ -25,4 +27,20 @@ public static boolean deleteLineByName(String name) { public static void deleteAll() { lines.clear(); } + + public static Boolean isConnected(Station startStation, Station endStation) { + List lines = stationContainLines(startStation); + for (Line line : lines) { + if (line.isStationContained(endStation)) { + return true; + } + } + return false; + } + + private static List stationContainLines(Station station) { + return lines().stream() + .filter(line -> line.isStationContained(station)) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/subway/service/DistanceRouteService.java b/src/main/java/subway/service/DistanceRouteService.java index 3d9dfbd29..e1e98f764 100644 --- a/src/main/java/subway/service/DistanceRouteService.java +++ b/src/main/java/subway/service/DistanceRouteService.java @@ -21,6 +21,7 @@ public void routingService(Scanner scanner) { Station startStation = inputStartStations(scanner); Station endStation = inputEndStation(scanner); RouteService.isSameName(startStation, endStation); + RouteService.isAvailableRoute(startStation, endStation); } catch (IllegalArgumentException e) { goToMenu(e, scanner); } diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index c991866e7..945bea9d1 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -1,7 +1,9 @@ package subway.service; import subway.controller.RouteController; +import subway.domain.Line; import subway.domain.Station; +import subway.repository.LineRepository; import subway.repository.StationRepository; import subway.views.routeviews.RouteInputView; @@ -10,6 +12,7 @@ public interface RouteService { String NOT_EXIST_STATION_ERROR = "[ERROR} 존재하지 않는 역입니다."; String SAME_STATION_ERROR = "[ERROR] 같은 역은 입력할 수 없습니다."; + String NOT_CONNECTED_STATIONS = "[ERROR] 두 역이 연결되어 있지 않습니다."; void routingService(Scanner scanner); @@ -42,4 +45,10 @@ static void isSameName(Station startStation, Station endStation) { throw new IllegalArgumentException(SAME_STATION_ERROR); } } + + static void isAvailableRoute(Station startStation, Station endStation) { + if (!LineRepository.isConnected(startStation, endStation)) { + throw new IllegalArgumentException(NOT_CONNECTED_STATIONS); + } + } } diff --git a/src/main/java/subway/service/TimeRouteService.java b/src/main/java/subway/service/TimeRouteService.java index 4f8b4c204..cb099c324 100644 --- a/src/main/java/subway/service/TimeRouteService.java +++ b/src/main/java/subway/service/TimeRouteService.java @@ -20,6 +20,7 @@ public void routingService(Scanner scanner) { Station startStation = inputStartStations(scanner); Station endStation = inputEndStation(scanner); RouteService.isSameName(startStation, endStation); + RouteService.isAvailableRoute(startStation, endStation); } catch (IllegalArgumentException e) { goToMenu(e, scanner); } From e570cc50ddb2abab8daa1b33f41bc07c3820f036 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 17:42:54 +0900 Subject: [PATCH 19/35] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A6=84=EC=9D=B4=20?= =?UTF-8?q?=EA=B0=99=EC=9C=BC=EB=A9=B4=20=EA=B0=99=EC=9D=80=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EC=9E=84=EC=9D=84=20=EC=9C=84=ED=95=B4=20equals,=20ha?= =?UTF-8?q?shCode=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=98=A4=EB=B2=84?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Line.java | 21 +++++++++++++++++++++ src/main/java/subway/domain/Station.java | 21 ++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 6b7ce6b4b..3fc9349b2 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -20,4 +20,25 @@ public void addLineStation(Station station) { public Boolean isStationContained(Station station) { return stations.isContain(station); } + + @Override + public boolean equals(Object object) { + if (getClass() != object.getClass()) { + return false; + } + boolean isEqualObject = false; + Line line = (Line) object; + if (getName().equals(line.getName())) { + isEqualObject = true; + } + return isEqualObject; + } + + @Override + public int hashCode() { + final int prime = 31; + int hashCode = 1; + hashCode = prime * hashCode + getName().hashCode(); + return hashCode; + } } diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index bdb142590..dba8be823 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -11,5 +11,24 @@ public String getName() { return name; } - // 추가 기능 구현 + @Override + public boolean equals(Object object) { + if (getClass() != object.getClass()) { + return false; + } + boolean isEqualObject = false; + Station station = (Station) object; + if (getName().equals(station.getName())) { + isEqualObject = true; + } + return isEqualObject; + } + + @Override + public int hashCode() { + final int prime = 31; + int hashCode = 1; + hashCode = prime * hashCode + getName().hashCode(); + return hashCode; + } } From 8ca210a132b6e4194e13deace4a40a7dd722fe90 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 17:46:05 +0900 Subject: [PATCH 20/35] =?UTF-8?q?feat:=20application=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=EC=84=9C=20=EC=B4=88=EA=B8=B0=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EC=85=8B=ED=8C=85=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=ED=94=84=EB=A1=9C=EA=B7=B8=EB=9E=A8=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=EB=8F=99=ED=95=98=EB=8A=94=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 에러 출력 포멧 수정 --- README.md | 2 +- src/main/java/subway/Application.java | 7 ++++++- src/main/java/subway/service/RouteService.java | 6 +++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 47d16d64b..1d211b27e 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ - [] 출발역에서 도착역까지 가는 최단 경로를 구한다. - - [] [예외 처리] 출발 역과 도착역이 연결되어 있지 않으면 에러를 출력한다. + - [x] [예외 처리] 출발 역과 도착역이 연결되어 있지 않으면 에러를 출력한다. - [] 출발역에서 도착역 까지 가는 경로를 포함하여 총 거리와 총 소요 시간을 아래와 같이 출력한다. diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..dc842a22b 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,15 @@ package subway; +import subway.controller.MainController; + import java.util.Scanner; public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); - // TODO: 프로그램 구현 + InitialSetting.settingInitialSubways(); + + MainController mainController = MainController.getInstance(); + mainController.run(scanner); } } diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index 945bea9d1..fc0c53fc3 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -10,9 +10,9 @@ import java.util.Scanner; public interface RouteService { - String NOT_EXIST_STATION_ERROR = "[ERROR} 존재하지 않는 역입니다."; - String SAME_STATION_ERROR = "[ERROR] 같은 역은 입력할 수 없습니다."; - String NOT_CONNECTED_STATIONS = "[ERROR] 두 역이 연결되어 있지 않습니다."; + String NOT_EXIST_STATION_ERROR = "\n[ERROR} 존재하지 않는 역입니다."; + String SAME_STATION_ERROR = "\n[ERROR] 같은 역은 입력할 수 없습니다."; + String NOT_CONNECTED_STATIONS = "\n[ERROR] 두 역이 연결되어 있지 않습니다."; void routingService(Scanner scanner); From dc96057db84c61f2275e606b6d7152d7d62cefa2 Mon Sep 17 00:00:00 2001 From: tomas Date: Sat, 19 Dec 2020 17:59:09 +0900 Subject: [PATCH 21/35] =?UTF-8?q?feat:=20=EC=B5=9C=EB=8B=A8=20=EA=B1=B0?= =?UTF-8?q?=EB=A6=AC=20=EA=B5=AC=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/DistanceMap.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/subway/domain/DistanceMap.java diff --git a/src/main/java/subway/domain/DistanceMap.java b/src/main/java/subway/domain/DistanceMap.java new file mode 100644 index 000000000..efd9338b4 --- /dev/null +++ b/src/main/java/subway/domain/DistanceMap.java @@ -0,0 +1,20 @@ +package subway.domain; + +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; + +import java.util.List; + +public class DistanceMap { + WeightedMultigraph distanceMap + = new WeightedMultigraph(DefaultWeightedEdge.class); + + public void addStationVertex(List stations) { + stations.stream() + .forEach(station -> distanceMap.addVertex(station)); + } + + public void addWeight(Section section, int distance) { + distanceMap.setEdgeWeight(,distance); + } +} From d6ef032341bdc14bfdbbf551a7f082c4408c2b68 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 15:31:04 +0900 Subject: [PATCH 22/35] =?UTF-8?q?feat:=20section=EC=9D=98=20=EB=8F=99?= =?UTF-8?q?=EC=9D=BC=EC=84=B1=20=ED=99=95=EC=9D=B8=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20equals,=20hashcode=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=98=A4=EB=B2=84=EB=9D=BC=EC=9D=B4=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Section.java | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/subway/domain/Section.java b/src/main/java/subway/domain/Section.java index c3d2f1790..92874ef74 100644 --- a/src/main/java/subway/domain/Section.java +++ b/src/main/java/subway/domain/Section.java @@ -8,4 +8,35 @@ public Section(Station firstStation, Station secondStation) { this.firstStation = firstStation; this.secondStation = secondStation; } + + public Station getFirstStation() { + return firstStation; + } + + public Station getSecondStation() { + return secondStation; + } + + @Override + public boolean equals(Object object) { + if (getClass() != object.getClass()) { + return false; + } + boolean isEqualObject = false; + Section section = (Section) object; + if (firstStation.getName().equals(section.firstStation.getName()) + && secondStation.getName().equals(section.secondStation.getName())) { + isEqualObject = true; + } + return isEqualObject; + } + + @Override + public int hashCode() { + final int prime = 31; + int hashCode = 1; + hashCode = prime * hashCode + firstStation.getName().hashCode() + + secondStation.getName().hashCode(); + return hashCode; + } } From b90228241a9257bbea8f624f54a1103dcabd2355 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 15:53:12 +0900 Subject: [PATCH 23/35] =?UTF-8?q?feat:=20=EC=97=AD=EC=9D=B4=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=EB=90=98=EC=97=88=EB=8A=94=EC=A7=80=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 출발하는 역이 다른 노선에 있어야 연결되었다고 확인하는 오류로 인한 삭제 DijkstraShortestPath의 getPath 메소드에서 그래프가 연결되어 있지 않아서 최단거리를 찾지 못할 때 null값을 반환하는 것을 이용하여 역이 연결되었는지 확인하기로 결정 --- .../java/subway/repository/LineRepository.java | 18 ------------------ src/main/java/subway/service/RouteService.java | 8 +------- .../java/subway/service/TimeRouteService.java | 3 +-- 3 files changed, 2 insertions(+), 27 deletions(-) diff --git a/src/main/java/subway/repository/LineRepository.java b/src/main/java/subway/repository/LineRepository.java index d64e00085..84101c3e0 100644 --- a/src/main/java/subway/repository/LineRepository.java +++ b/src/main/java/subway/repository/LineRepository.java @@ -1,13 +1,11 @@ package subway.repository; import subway.domain.Line; -import subway.domain.Station; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; public class LineRepository { private static final List lines = new ArrayList<>(); @@ -27,20 +25,4 @@ public static boolean deleteLineByName(String name) { public static void deleteAll() { lines.clear(); } - - public static Boolean isConnected(Station startStation, Station endStation) { - List lines = stationContainLines(startStation); - for (Line line : lines) { - if (line.isStationContained(endStation)) { - return true; - } - } - return false; - } - - private static List stationContainLines(Station station) { - return lines().stream() - .filter(line -> line.isStationContained(station)) - .collect(Collectors.toList()); - } } diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index fc0c53fc3..384943024 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -40,15 +40,9 @@ static void isExistStation(Station station) { } } - static void isSameName(Station startStation, Station endStation) { + default void isSameName(Station startStation, Station endStation) { if (startStation.getName().equals(endStation.getName())) { throw new IllegalArgumentException(SAME_STATION_ERROR); } } - - static void isAvailableRoute(Station startStation, Station endStation) { - if (!LineRepository.isConnected(startStation, endStation)) { - throw new IllegalArgumentException(NOT_CONNECTED_STATIONS); - } - } } diff --git a/src/main/java/subway/service/TimeRouteService.java b/src/main/java/subway/service/TimeRouteService.java index cb099c324..582e3e798 100644 --- a/src/main/java/subway/service/TimeRouteService.java +++ b/src/main/java/subway/service/TimeRouteService.java @@ -19,8 +19,7 @@ public void routingService(Scanner scanner) { try { Station startStation = inputStartStations(scanner); Station endStation = inputEndStation(scanner); - RouteService.isSameName(startStation, endStation); - RouteService.isAvailableRoute(startStation, endStation); + isSameName(startStation, endStation); } catch (IllegalArgumentException e) { goToMenu(e, scanner); } From 2eee6d35a70cc690e10ea95b121e16a89403d800 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 16:33:50 +0900 Subject: [PATCH 24/35] =?UTF-8?q?feat:=20=EC=B5=9C=EB=8B=A8=EA=B1=B0?= =?UTF-8?q?=EB=A6=AC=EB=A1=9C=20=EA=B2=BD=EB=A1=9C=EB=A5=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EA=B2=BD=EB=A1=9C=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SectionRepository에 모든 간선의 정보를 저장하고, StationRepository에서 모든 역의 정점을 구해와서 그래프를 그린 후, SectionRepository의 간선정보로 최단거리 경로를 구한다. --- src/main/java/subway/domain/Distance.java | 4 ++ src/main/java/subway/domain/DistanceMap.java | 23 ++++++----- .../java/subway/domain/RequiredResources.java | 8 ++++ src/main/java/subway/domain/SubwayGraph.java | 28 ++++++++++++++ src/main/java/subway/domain/Time.java | 4 ++ .../subway/service/DistanceRouteService.java | 38 +++++++++++++++++-- .../java/subway/service/RouteService.java | 2 - .../views/routeviews/RouteOutputView.java | 25 ++++++++++++ 8 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 src/main/java/subway/domain/SubwayGraph.java diff --git a/src/main/java/subway/domain/Distance.java b/src/main/java/subway/domain/Distance.java index b036ea9a8..848b34566 100644 --- a/src/main/java/subway/domain/Distance.java +++ b/src/main/java/subway/domain/Distance.java @@ -6,4 +6,8 @@ public class Distance { public Distance(int distance) { this.distance = distance; } + + public int getDistance() { + return distance; + } } diff --git a/src/main/java/subway/domain/DistanceMap.java b/src/main/java/subway/domain/DistanceMap.java index efd9338b4..3ed5fe328 100644 --- a/src/main/java/subway/domain/DistanceMap.java +++ b/src/main/java/subway/domain/DistanceMap.java @@ -1,20 +1,23 @@ package subway.domain; -import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.GraphPath; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; import org.jgrapht.graph.WeightedMultigraph; +import subway.repository.SectionRepository; import java.util.List; +import java.util.Map; -public class DistanceMap { - WeightedMultigraph distanceMap - = new WeightedMultigraph(DefaultWeightedEdge.class); - - public void addStationVertex(List stations) { - stations.stream() - .forEach(station -> distanceMap.addVertex(station)); +public class DistanceMap implements SubwayGraph{ + public void addWeight() { + Map sections = SectionRepository.sections(); + sections.forEach((key, value) + -> subwayGraph.setEdgeWeight(subwayGraph.addEdge(key.getFirstStation(), key.getSecondStation()), value.getDistance().getDistance())); } - public void addWeight(Section section, int distance) { - distanceMap.setEdgeWeight(,distance); + public List getShortestDistanceRoute(WeightedMultigraph graph, Station first, Station second) { + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(graph); + isConnectedMap(dijkstraShortestPath.getPath(first, second)); + return dijkstraShortestPath.getPath(first, second).getVertexList(); } } diff --git a/src/main/java/subway/domain/RequiredResources.java b/src/main/java/subway/domain/RequiredResources.java index 3e9c37d5b..44a933164 100644 --- a/src/main/java/subway/domain/RequiredResources.java +++ b/src/main/java/subway/domain/RequiredResources.java @@ -8,4 +8,12 @@ public RequiredResources(int distance, int time) { this.distance = new Distance(distance); this.time = new Time(time); } + + public Distance getDistance() { + return distance; + } + + public Time getTime() { + return time; + } } diff --git a/src/main/java/subway/domain/SubwayGraph.java b/src/main/java/subway/domain/SubwayGraph.java new file mode 100644 index 000000000..d42c16738 --- /dev/null +++ b/src/main/java/subway/domain/SubwayGraph.java @@ -0,0 +1,28 @@ +package subway.domain; + +import org.jgrapht.GraphPath; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; +import subway.repository.StationRepository; + +public interface SubwayGraph { + String NOT_CONNECTED_STATION_MESSAGE = "[ERROR] 두 역은 연결되지 않았습니다."; + + WeightedMultigraph subwayGraph + = new WeightedMultigraph(DefaultWeightedEdge.class); + + default void addStationVertex() { + StationRepository.stations() + .forEach(subwayGraph::addVertex); + } + + default WeightedMultigraph getGraph() { + return subwayGraph; + } + + default void isConnectedMap(GraphPath shortestPath) { + if (shortestPath == null) { + throw new IllegalArgumentException(NOT_CONNECTED_STATION_MESSAGE); + } + } +} diff --git a/src/main/java/subway/domain/Time.java b/src/main/java/subway/domain/Time.java index 6f5d6f040..2d847f344 100644 --- a/src/main/java/subway/domain/Time.java +++ b/src/main/java/subway/domain/Time.java @@ -6,4 +6,8 @@ public class Time { public Time(int time) { this.time = time; } + + public int getTime() { + return time; + } } diff --git a/src/main/java/subway/service/DistanceRouteService.java b/src/main/java/subway/service/DistanceRouteService.java index e1e98f764..1afe5dc1e 100644 --- a/src/main/java/subway/service/DistanceRouteService.java +++ b/src/main/java/subway/service/DistanceRouteService.java @@ -1,11 +1,15 @@ package subway.service; +import subway.domain.DistanceMap; +import subway.domain.Section; import subway.domain.Station; +import subway.repository.SectionRepository; +import subway.views.routeviews.RouteOutputView; +import java.util.List; import java.util.Scanner; public class DistanceRouteService implements RouteService { - private static final DistanceRouteService distanceRouteService = new DistanceRouteService(); private DistanceRouteService() { @@ -20,10 +24,38 @@ public void routingService(Scanner scanner) { try { Station startStation = inputStartStations(scanner); Station endStation = inputEndStation(scanner); - RouteService.isSameName(startStation, endStation); - RouteService.isAvailableRoute(startStation, endStation); + isSameName(startStation, endStation); + DistanceMap distanceMap = new DistanceMap(); + distanceMap.addStationVertex(); + distanceMap.addWeight(); + List stationList = distanceMap.getShortestDistanceRoute(distanceMap.getGraph(), startStation, endStation); + calculateTotalDistanceAndTime(stationList); } catch (IllegalArgumentException e) { goToMenu(e, scanner); } } + + private void calculateTotalDistanceAndTime(List shortestRouteStationList) { + int totalDistance = calculateTotalDistance(shortestRouteStationList); + int totalTime = calculateTotalTime(shortestRouteStationList); + RouteOutputView.printRoutedMapWithResources(shortestRouteStationList, totalDistance, totalTime); + } + + private int calculateTotalDistance(List shortestRouteStationList) { + int totalDistance = 0; + for (int i = 0; i < shortestRouteStationList.size()-1 ; i++) { + Section section = new Section(shortestRouteStationList.get(i), shortestRouteStationList.get(i + 1)); + totalDistance += SectionRepository.sections().get(section).getDistance().getDistance(); + } + return totalDistance; + } + + private int calculateTotalTime(List shortestRouteStationList) { + int totalTime = 0; + for (int i = 0; i < shortestRouteStationList.size()-1 ; i++) { + Section section = new Section(shortestRouteStationList.get(i), shortestRouteStationList.get(i + 1)); + totalTime += SectionRepository.sections().get(section).getTime().getTime(); + } + return totalTime; + } } diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index 384943024..2137014f0 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -1,9 +1,7 @@ package subway.service; import subway.controller.RouteController; -import subway.domain.Line; import subway.domain.Station; -import subway.repository.LineRepository; import subway.repository.StationRepository; import subway.views.routeviews.RouteInputView; diff --git a/src/main/java/subway/views/routeviews/RouteOutputView.java b/src/main/java/subway/views/routeviews/RouteOutputView.java index f916beefa..62210f6da 100644 --- a/src/main/java/subway/views/routeviews/RouteOutputView.java +++ b/src/main/java/subway/views/routeviews/RouteOutputView.java @@ -1,14 +1,23 @@ package subway.views.routeviews; +import subway.domain.Station; import subway.menus.RouteMenu; import subway.views.OutputView; import java.util.Arrays; +import java.util.List; public class RouteOutputView implements OutputView { private static final String ROUTE_SCREEN_MESSAGE = "## 경로 기준"; private static final String INPUT_START_STATION_MESSAGE = "## 출발역을 입력하세요."; private static final String INPUT_END_STATION_MESSAGE = "## 도착역을 입력하세요."; + private static final String ROUTE_RESULT_MESSAGE = "## 조회 결과"; + private static final String INFORMATION = "[INFO] "; + private static final String SEPARATOR = "---"; + private static final String TOTAL_DISTANCE_MESSAGE = "총 거리: "; + private static final String TOTAL_TIME_MESSAGE = "총 소요 시간: "; + private static final String DISTANCE_UNIT = "km"; + private static final String TIME_UNIT = "분"; public static void printRouteMenu() { System.out.println(LINE_WRAP + ROUTE_SCREEN_MESSAGE); @@ -23,4 +32,20 @@ public static void printStartStationMessage() { public static void printEndStationMessage() { System.out.println(LINE_WRAP + INPUT_END_STATION_MESSAGE); } + + public static void printRoutedMapWithResources(List stationList, int distance, int time) { + System.out.println(LINE_WRAP + ROUTE_RESULT_MESSAGE); + System.out.println(INFORMATION + SEPARATOR); + System.out.println(INFORMATION + TOTAL_DISTANCE_MESSAGE + distance + DISTANCE_UNIT); + System.out.println(INFORMATION + TOTAL_TIME_MESSAGE + time + TIME_UNIT); + System.out.println(INFORMATION + SEPARATOR); + printRoute(stationList); + System.out.println(); + } + + static void printRoute(List stationList) { + stationList.stream() + .map(Station::getName) + .forEach(stationName -> System.out.println(INFORMATION + stationName)); + } } From 6b5e0b9fba3a0afb5fbb8ad3262e0b8882d9b468 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 16:38:40 +0900 Subject: [PATCH 25/35] =?UTF-8?q?refactor:=20=EA=B2=BD=EB=A1=9C=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=8B=9C=EA=B0=84=EA=B3=BC=20=EA=B1=B0=EB=A6=AC?= =?UTF-8?q?=EB=A5=BC=20=EA=B3=84=EC=82=B0=ED=95=98=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EC=9D=80=20=EA=B3=B5=ED=86=B5=EB=B6=80=EB=B6=84?= =?UTF-8?q?=EC=9D=B4=EB=AF=80=EB=A1=9C=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/SubwayGraph.java | 2 +- .../subway/service/DistanceRouteService.java | 27 ----------------- .../java/subway/service/RouteService.java | 29 ++++++++++++++++++- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/main/java/subway/domain/SubwayGraph.java b/src/main/java/subway/domain/SubwayGraph.java index d42c16738..314b3f3c9 100644 --- a/src/main/java/subway/domain/SubwayGraph.java +++ b/src/main/java/subway/domain/SubwayGraph.java @@ -6,7 +6,7 @@ import subway.repository.StationRepository; public interface SubwayGraph { - String NOT_CONNECTED_STATION_MESSAGE = "[ERROR] 두 역은 연결되지 않았습니다."; + String NOT_CONNECTED_STATION_MESSAGE = "\n[ERROR] 두 역은 연결되지 않았습니다."; WeightedMultigraph subwayGraph = new WeightedMultigraph(DefaultWeightedEdge.class); diff --git a/src/main/java/subway/service/DistanceRouteService.java b/src/main/java/subway/service/DistanceRouteService.java index 1afe5dc1e..9f0c64f5e 100644 --- a/src/main/java/subway/service/DistanceRouteService.java +++ b/src/main/java/subway/service/DistanceRouteService.java @@ -1,10 +1,7 @@ package subway.service; import subway.domain.DistanceMap; -import subway.domain.Section; import subway.domain.Station; -import subway.repository.SectionRepository; -import subway.views.routeviews.RouteOutputView; import java.util.List; import java.util.Scanner; @@ -34,28 +31,4 @@ public void routingService(Scanner scanner) { goToMenu(e, scanner); } } - - private void calculateTotalDistanceAndTime(List shortestRouteStationList) { - int totalDistance = calculateTotalDistance(shortestRouteStationList); - int totalTime = calculateTotalTime(shortestRouteStationList); - RouteOutputView.printRoutedMapWithResources(shortestRouteStationList, totalDistance, totalTime); - } - - private int calculateTotalDistance(List shortestRouteStationList) { - int totalDistance = 0; - for (int i = 0; i < shortestRouteStationList.size()-1 ; i++) { - Section section = new Section(shortestRouteStationList.get(i), shortestRouteStationList.get(i + 1)); - totalDistance += SectionRepository.sections().get(section).getDistance().getDistance(); - } - return totalDistance; - } - - private int calculateTotalTime(List shortestRouteStationList) { - int totalTime = 0; - for (int i = 0; i < shortestRouteStationList.size()-1 ; i++) { - Section section = new Section(shortestRouteStationList.get(i), shortestRouteStationList.get(i + 1)); - totalTime += SectionRepository.sections().get(section).getTime().getTime(); - } - return totalTime; - } } diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index 2137014f0..3e667e34e 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -1,16 +1,19 @@ package subway.service; import subway.controller.RouteController; +import subway.domain.Section; import subway.domain.Station; +import subway.repository.SectionRepository; import subway.repository.StationRepository; import subway.views.routeviews.RouteInputView; +import subway.views.routeviews.RouteOutputView; +import java.util.List; import java.util.Scanner; public interface RouteService { String NOT_EXIST_STATION_ERROR = "\n[ERROR} 존재하지 않는 역입니다."; String SAME_STATION_ERROR = "\n[ERROR] 같은 역은 입력할 수 없습니다."; - String NOT_CONNECTED_STATIONS = "\n[ERROR] 두 역이 연결되어 있지 않습니다."; void routingService(Scanner scanner); @@ -43,4 +46,28 @@ default void isSameName(Station startStation, Station endStation) { throw new IllegalArgumentException(SAME_STATION_ERROR); } } + + default void calculateTotalDistanceAndTime(List shortestRouteStationList) { + int totalDistance = calculateTotalDistance(shortestRouteStationList); + int totalTime = calculateTotalTime(shortestRouteStationList); + RouteOutputView.printRoutedMapWithResources(shortestRouteStationList, totalDistance, totalTime); + } + + default int calculateTotalDistance(List shortestRouteStationList) { + int totalDistance = 0; + for (int i = 0; i < shortestRouteStationList.size()-1 ; i++) { + Section section = new Section(shortestRouteStationList.get(i), shortestRouteStationList.get(i + 1)); + totalDistance += SectionRepository.sections().get(section).getDistance().getDistance(); + } + return totalDistance; + } + + default int calculateTotalTime(List shortestRouteStationList) { + int totalTime = 0; + for (int i = 0; i < shortestRouteStationList.size()-1 ; i++) { + Section section = new Section(shortestRouteStationList.get(i), shortestRouteStationList.get(i + 1)); + totalTime += SectionRepository.sections().get(section).getTime().getTime(); + } + return totalTime; + } } From 81ee171c9495a2b307351742c68dfeb770575930 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 16:53:36 +0900 Subject: [PATCH 26/35] =?UTF-8?q?feat:=20=EC=B5=9C=EB=8B=A8=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EC=9C=BC=EB=A1=9C=20=EA=B2=BD=EB=A1=9C=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 최단경로, 최소시간 서비스 둘다 공통적으로 서비스를 실행하는 routingService메서드를 인터페이스에 정의 --- src/main/java/subway/domain/DistanceMap.java | 2 +- src/main/java/subway/domain/SubwayGraph.java | 5 +++++ src/main/java/subway/domain/TimeMap.java | 22 +++++++++++++++++++ .../subway/service/DistanceRouteService.java | 2 +- .../java/subway/service/TimeRouteService.java | 7 ++++++ 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/main/java/subway/domain/TimeMap.java diff --git a/src/main/java/subway/domain/DistanceMap.java b/src/main/java/subway/domain/DistanceMap.java index 3ed5fe328..e14c5f2ea 100644 --- a/src/main/java/subway/domain/DistanceMap.java +++ b/src/main/java/subway/domain/DistanceMap.java @@ -15,7 +15,7 @@ public void addWeight() { -> subwayGraph.setEdgeWeight(subwayGraph.addEdge(key.getFirstStation(), key.getSecondStation()), value.getDistance().getDistance())); } - public List getShortestDistanceRoute(WeightedMultigraph graph, Station first, Station second) { + public List getShortestRoute(WeightedMultigraph graph, Station first, Station second) { DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(graph); isConnectedMap(dijkstraShortestPath.getPath(first, second)); return dijkstraShortestPath.getPath(first, second).getVertexList(); diff --git a/src/main/java/subway/domain/SubwayGraph.java b/src/main/java/subway/domain/SubwayGraph.java index 314b3f3c9..a2337b4ff 100644 --- a/src/main/java/subway/domain/SubwayGraph.java +++ b/src/main/java/subway/domain/SubwayGraph.java @@ -5,6 +5,8 @@ import org.jgrapht.graph.WeightedMultigraph; import subway.repository.StationRepository; +import java.util.List; + public interface SubwayGraph { String NOT_CONNECTED_STATION_MESSAGE = "\n[ERROR] 두 역은 연결되지 않았습니다."; @@ -25,4 +27,7 @@ default void isConnectedMap(GraphPath shortestPath) { throw new IllegalArgumentException(NOT_CONNECTED_STATION_MESSAGE); } } + + void addWeight(); + List getShortestRoute(WeightedMultigraph graph, Station firstStation, Station secondStation); } diff --git a/src/main/java/subway/domain/TimeMap.java b/src/main/java/subway/domain/TimeMap.java new file mode 100644 index 000000000..dcca1ba64 --- /dev/null +++ b/src/main/java/subway/domain/TimeMap.java @@ -0,0 +1,22 @@ +package subway.domain; + +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.WeightedMultigraph; +import subway.repository.SectionRepository; + +import java.util.List; +import java.util.Map; + +public class TimeMap implements SubwayGraph{ + public void addWeight() { + Map sections = SectionRepository.sections(); + sections.forEach((key, value) + -> subwayGraph.setEdgeWeight(subwayGraph.addEdge(key.getFirstStation(), key.getSecondStation()), value.getTime().getTime())); + } + + public List getShortestRoute(WeightedMultigraph graph, Station first, Station second) { + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(graph); + isConnectedMap(dijkstraShortestPath.getPath(first, second)); + return dijkstraShortestPath.getPath(first, second).getVertexList(); + } +} diff --git a/src/main/java/subway/service/DistanceRouteService.java b/src/main/java/subway/service/DistanceRouteService.java index 9f0c64f5e..3a73e5619 100644 --- a/src/main/java/subway/service/DistanceRouteService.java +++ b/src/main/java/subway/service/DistanceRouteService.java @@ -25,7 +25,7 @@ public void routingService(Scanner scanner) { DistanceMap distanceMap = new DistanceMap(); distanceMap.addStationVertex(); distanceMap.addWeight(); - List stationList = distanceMap.getShortestDistanceRoute(distanceMap.getGraph(), startStation, endStation); + List stationList = distanceMap.getShortestRoute(distanceMap.getGraph(), startStation, endStation); calculateTotalDistanceAndTime(stationList); } catch (IllegalArgumentException e) { goToMenu(e, scanner); diff --git a/src/main/java/subway/service/TimeRouteService.java b/src/main/java/subway/service/TimeRouteService.java index 582e3e798..142d0e582 100644 --- a/src/main/java/subway/service/TimeRouteService.java +++ b/src/main/java/subway/service/TimeRouteService.java @@ -1,7 +1,9 @@ package subway.service; import subway.domain.Station; +import subway.domain.TimeMap; +import java.util.List; import java.util.Scanner; public class TimeRouteService implements RouteService { @@ -20,6 +22,11 @@ public void routingService(Scanner scanner) { Station startStation = inputStartStations(scanner); Station endStation = inputEndStation(scanner); isSameName(startStation, endStation); + TimeMap timeMap = new TimeMap(); + timeMap.addStationVertex(); + timeMap.addWeight(); + List stationList = timeMap.getShortestRoute(timeMap.getGraph(), startStation, endStation); + calculateTotalDistanceAndTime(stationList); } catch (IllegalArgumentException e) { goToMenu(e, scanner); } From 9af6db4b6fab28a446643a7f7cf566b2920d6b22 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 16:55:52 +0900 Subject: [PATCH 27/35] =?UTF-8?q?docs(README.md):=20=EB=A6=AC=EB=93=9C?= =?UTF-8?q?=EB=AF=B8=20=EB=AC=B8=EC=84=9C=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1d211b27e..b7b7c8acb 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,15 @@ - [x] [예외 처리] 등록되지 않은 역을 입력받으면 에러를 출력한다. - [x] [예외 처리] 입력받은 출발역과 도착역이 같으면 에러를 출력한다. - - [] 출발역에서 도착역까지 가는 최단 경로를 구한다. + - [x] 출발역에서 도착역까지 가는 최단 거리 경로를 구한다. - [x] [예외 처리] 출발 역과 도착역이 연결되어 있지 않으면 에러를 출력한다. - - [] 출발역에서 도착역 까지 가는 경로를 포함하여 총 거리와 총 소요 시간을 아래와 같이 출력한다. + - [x] 출발역에서 도착역까지 가는 최단 시간 경로를 구한다. + + - [x] [예외 처리] 출발 역과 도착역이 연결되어 있지 않으면 에러를 출력한다. + + - [x] 출발역에서 도착역 까지 가는 경로를 포함하여 총 거리와 총 소요 시간을 아래와 같이 출력한다. ``` ##조회 결과 From 7c1556dbd5351e4dfd92fb965c4b122fe375b3ec Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 18:18:38 +0900 Subject: [PATCH 28/35] =?UTF-8?q?refactor:=20=EC=93=B0=EC=A7=80=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20import=20=EC=A0=9C=EA=B1=B0,=20import=EC=97=90=20?= =?UTF-8?q?=EC=99=80=EC=9D=BC=EB=93=9C=EC=B9=B4=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/DistanceMap.java | 1 - src/main/java/subway/domain/Line.java | 4 ---- src/main/java/subway/menus/MainMenu.java | 4 +--- src/main/java/subway/menus/RouteMenu.java | 4 +--- src/main/java/subway/repository/SectionRepository.java | 4 +++- 5 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/main/java/subway/domain/DistanceMap.java b/src/main/java/subway/domain/DistanceMap.java index e14c5f2ea..d2a626b1e 100644 --- a/src/main/java/subway/domain/DistanceMap.java +++ b/src/main/java/subway/domain/DistanceMap.java @@ -1,6 +1,5 @@ package subway.domain; -import org.jgrapht.GraphPath; import org.jgrapht.alg.shortestpath.DijkstraShortestPath; import org.jgrapht.graph.WeightedMultigraph; import subway.repository.SectionRepository; diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 3fc9349b2..c816c1751 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -17,10 +17,6 @@ public void addLineStation(Station station) { stations.addLineStation(station); } - public Boolean isStationContained(Station station) { - return stations.isContain(station); - } - @Override public boolean equals(Object object) { if (getClass() != object.getClass()) { diff --git a/src/main/java/subway/menus/MainMenu.java b/src/main/java/subway/menus/MainMenu.java index df5d78cc0..e687e62c7 100644 --- a/src/main/java/subway/menus/MainMenu.java +++ b/src/main/java/subway/menus/MainMenu.java @@ -9,9 +9,7 @@ public enum MainMenu { ROUTE_LOOKUP("1", "경로 조회", RouteController::getInstance), - EXIT_PROGRAM("Q", "종료", () -> { - return null; - }); + EXIT_PROGRAM("Q", "종료", () -> null); private final String option; private final String description; diff --git a/src/main/java/subway/menus/RouteMenu.java b/src/main/java/subway/menus/RouteMenu.java index ca430aa20..3f9062ca3 100644 --- a/src/main/java/subway/menus/RouteMenu.java +++ b/src/main/java/subway/menus/RouteMenu.java @@ -12,9 +12,7 @@ public enum RouteMenu { SHORTEST_DISTANCE("1", "최단 거리", DistanceRouteService::getInstance), SHORTEST_TIME("2", "최소 시간", TimeRouteService::getInstance), - GO_BACK_TO_MAIN_MENU("B", "돌아가기", () -> { - return null; - }); + GO_BACK_TO_MAIN_MENU("B", "돌아가기", () -> null); private final String option; private final String description; diff --git a/src/main/java/subway/repository/SectionRepository.java b/src/main/java/subway/repository/SectionRepository.java index f52c55929..ae2608a3d 100644 --- a/src/main/java/subway/repository/SectionRepository.java +++ b/src/main/java/subway/repository/SectionRepository.java @@ -3,7 +3,9 @@ import subway.domain.RequiredResources; import subway.domain.Section; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; public class SectionRepository { private static Map sections = new HashMap<>(); From 45ce773caf8a902c832d9dbc218d566c0680fd68 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 18:34:36 +0900 Subject: [PATCH 29/35] =?UTF-8?q?refactor:=20=EC=B6=9C=EB=A0=A5=EC=9D=84?= =?UTF-8?q?=20=EB=8B=B4=EB=8B=B9=ED=95=98=EB=8A=94=20=EC=9C=A0=ED=8B=B8?= =?UTF-8?q?=EB=A6=AC=ED=8B=B0=EC=84=B1=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20private=EC=83=9D=EC=84=B1=EC=9E=90=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20=EA=B0=9D=EC=B2=B4=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/views/mainviews/MainInputView.java | 3 +++ src/main/java/subway/views/mainviews/MainOutputView.java | 3 +++ src/main/java/subway/views/routeviews/RouteInputView.java | 3 +++ src/main/java/subway/views/routeviews/RouteOutputView.java | 5 ++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/views/mainviews/MainInputView.java b/src/main/java/subway/views/mainviews/MainInputView.java index b0c9df625..d13353b40 100644 --- a/src/main/java/subway/views/mainviews/MainInputView.java +++ b/src/main/java/subway/views/mainviews/MainInputView.java @@ -5,6 +5,9 @@ import java.util.Scanner; public class MainInputView { + private MainInputView() { + } + public static String inputMainOption(Scanner scanner) { OutputView.printSelectOptionMessage(); return scanner.nextLine(); diff --git a/src/main/java/subway/views/mainviews/MainOutputView.java b/src/main/java/subway/views/mainviews/MainOutputView.java index ddda750e9..c96975dec 100644 --- a/src/main/java/subway/views/mainviews/MainOutputView.java +++ b/src/main/java/subway/views/mainviews/MainOutputView.java @@ -8,6 +8,9 @@ public class MainOutputView implements OutputView { private static final String MAIN_SCREEN_MESSAGE = "## 메인 화면"; + private MainOutputView() { + } + public static void printMainMenu() { System.out.println(MAIN_SCREEN_MESSAGE); Arrays.stream(MainMenu.values()) diff --git a/src/main/java/subway/views/routeviews/RouteInputView.java b/src/main/java/subway/views/routeviews/RouteInputView.java index bc7cedad6..a056ba892 100644 --- a/src/main/java/subway/views/routeviews/RouteInputView.java +++ b/src/main/java/subway/views/routeviews/RouteInputView.java @@ -5,6 +5,9 @@ import java.util.Scanner; public class RouteInputView { + private RouteInputView() { + } + public static String inputRouteOption(Scanner scanner) { OutputView.printSelectOptionMessage(); return scanner.nextLine(); diff --git a/src/main/java/subway/views/routeviews/RouteOutputView.java b/src/main/java/subway/views/routeviews/RouteOutputView.java index 62210f6da..b245c3629 100644 --- a/src/main/java/subway/views/routeviews/RouteOutputView.java +++ b/src/main/java/subway/views/routeviews/RouteOutputView.java @@ -19,6 +19,9 @@ public class RouteOutputView implements OutputView { private static final String DISTANCE_UNIT = "km"; private static final String TIME_UNIT = "분"; + private RouteOutputView() { + } + public static void printRouteMenu() { System.out.println(LINE_WRAP + ROUTE_SCREEN_MESSAGE); Arrays.stream(RouteMenu.values()) @@ -43,7 +46,7 @@ public static void printRoutedMapWithResources(List stationList, int di System.out.println(); } - static void printRoute(List stationList) { + private static void printRoute(List stationList) { stationList.stream() .map(Station::getName) .forEach(stationName -> System.out.println(INFORMATION + stationName)); From 36426c12f29be70c338450f565cbb6eee6ddad96 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 18:35:17 +0900 Subject: [PATCH 30/35] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=8C=80=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EB=A1=9C=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/subway/controller/MainController.java | 4 ++-- src/main/java/subway/controller/RouteController.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/subway/controller/MainController.java b/src/main/java/subway/controller/MainController.java index ad2f6eeaa..591199fb5 100644 --- a/src/main/java/subway/controller/MainController.java +++ b/src/main/java/subway/controller/MainController.java @@ -8,13 +8,13 @@ public class MainController { private static final String END_CODE = "Q"; - private static final MainController mainController = new MainController(); + private static final MainController MAIN_CONTROLLER = new MainController(); private MainController() { } public static MainController getInstance() { - return mainController; + return MAIN_CONTROLLER; } public void run(Scanner scanner) { diff --git a/src/main/java/subway/controller/RouteController.java b/src/main/java/subway/controller/RouteController.java index 1c4ec0b8a..91e38c1c6 100644 --- a/src/main/java/subway/controller/RouteController.java +++ b/src/main/java/subway/controller/RouteController.java @@ -8,13 +8,13 @@ public class RouteController { private static final String GO_BACK_CODE = "B"; - private static final RouteController routeController = new RouteController(); + private static final RouteController ROUTE_CONTROLLER = new RouteController(); private RouteController() { } public static RouteController getInstance() { - return routeController; + return ROUTE_CONTROLLER; } public String mappingRouteMenu(Scanner scanner) { From d1b1287bfce71ce1c11063e2c8c78c16b99b9316 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 18:40:02 +0900 Subject: [PATCH 31/35] =?UTF-8?q?refactor:=20=EC=95=B1=EC=9D=84=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=ED=95=A0=20=EB=95=8C=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=ED=95=98=EB=8A=94=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=EC=9D=84=20=ED=95=98=EB=82=98=EC=9D=98=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EB=A1=9C=20=EB=96=BC=EC=96=B4=EB=83=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/InitialSetting.java | 9 +++++++-- src/main/java/subway/repository/SectionRepository.java | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/subway/InitialSetting.java b/src/main/java/subway/InitialSetting.java index a55b257a7..196128780 100644 --- a/src/main/java/subway/InitialSetting.java +++ b/src/main/java/subway/InitialSetting.java @@ -24,8 +24,7 @@ public class InitialSetting { private static final String[] LINE_SINBUNDANG_STATIONS = {"강남역", "양재역", "양재시민의숲역"}; public static void settingInitialSubways() { - StationRepository.deleteAll(); - LineRepository.deleteAll(); + deleteAllRepository(); settingInitialStations(); @@ -36,6 +35,12 @@ public static void settingInitialSubways() { settingInitialSection(); } + private static void deleteAllRepository() { + StationRepository.deleteAll(); + LineRepository.deleteAll(); + SectionRepository.deleteAll(); + } + private static void settingInitialStations() { StationRepository.addStation(new Station(GYODAE)); StationRepository.addStation(new Station(GANGNAM)); diff --git a/src/main/java/subway/repository/SectionRepository.java b/src/main/java/subway/repository/SectionRepository.java index ae2608a3d..0b967961b 100644 --- a/src/main/java/subway/repository/SectionRepository.java +++ b/src/main/java/subway/repository/SectionRepository.java @@ -17,4 +17,8 @@ public static Map sections() { public static void addSection(Section section, RequiredResources requiredResources) { sections.put(section, requiredResources); } + + public static void deleteAll() { + sections.clear(); + } } From 302ebf9d04b4b1ab2c36034e741fe5e53ec2d1f3 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 18:51:35 +0900 Subject: [PATCH 32/35] =?UTF-8?q?style:=20=EC=97=90=EB=9F=AC=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20prefix=20=EC=98=A4=ED=83=80=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/service/RouteService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index 3e667e34e..7e8e7077c 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -12,7 +12,7 @@ import java.util.Scanner; public interface RouteService { - String NOT_EXIST_STATION_ERROR = "\n[ERROR} 존재하지 않는 역입니다."; + String NOT_EXIST_STATION_ERROR = "\n[ERROR] 존재하지 않는 역입니다."; String SAME_STATION_ERROR = "\n[ERROR] 같은 역은 입력할 수 없습니다."; void routingService(Scanner scanner); @@ -32,7 +32,7 @@ default Station inputEndStation(Scanner scanner) { default void goToMenu(IllegalArgumentException e, Scanner scanner) { System.out.println(e.getMessage()); RouteController routeController = RouteController.getInstance(); - routeController.mappingRouteMenu(scanner); + routeController.mappingMenu(scanner); } static void isExistStation(Station station) { From a18fa079ec6d68a5924b687aa3fb18a5f7161e7d Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 18:51:58 +0900 Subject: [PATCH 33/35] =?UTF-8?q?refactor:=20Controller=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A1=9C=20=EB=AA=A8?= =?UTF-8?q?=EB=93=A0=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/controller/Controller.java | 7 +++++++ src/main/java/subway/controller/MainController.java | 8 ++++---- src/main/java/subway/controller/RouteController.java | 6 +++--- src/main/java/subway/menus/MainMenu.java | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 src/main/java/subway/controller/Controller.java diff --git a/src/main/java/subway/controller/Controller.java b/src/main/java/subway/controller/Controller.java new file mode 100644 index 000000000..9ceb375b9 --- /dev/null +++ b/src/main/java/subway/controller/Controller.java @@ -0,0 +1,7 @@ +package subway.controller; + +import java.util.Scanner; + +public interface Controller { + String mappingMenu(Scanner scanner); +} diff --git a/src/main/java/subway/controller/MainController.java b/src/main/java/subway/controller/MainController.java index 591199fb5..bcec3d531 100644 --- a/src/main/java/subway/controller/MainController.java +++ b/src/main/java/subway/controller/MainController.java @@ -6,7 +6,7 @@ import java.util.Scanner; -public class MainController { +public class MainController implements Controller{ private static final String END_CODE = "Q"; private static final MainController MAIN_CONTROLLER = new MainController(); @@ -20,11 +20,11 @@ public static MainController getInstance() { public void run(Scanner scanner) { String selectedOption; do { - selectedOption = mappingMainMenu(scanner); + selectedOption = mappingMenu(scanner); } while (!selectedOption.equals(END_CODE)); } - private String mappingMainMenu(Scanner scanner) { + public String mappingMenu(Scanner scanner) { try { MainOutputView.printMainMenu(); String selectedOption = MainInputView.inputMainOption(scanner); @@ -32,7 +32,7 @@ private String mappingMainMenu(Scanner scanner) { return selectedOption; } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); - return mappingMainMenu(scanner); + return mappingMenu(scanner); } } diff --git a/src/main/java/subway/controller/RouteController.java b/src/main/java/subway/controller/RouteController.java index 91e38c1c6..35d3c59f5 100644 --- a/src/main/java/subway/controller/RouteController.java +++ b/src/main/java/subway/controller/RouteController.java @@ -6,7 +6,7 @@ import java.util.Scanner; -public class RouteController { +public class RouteController implements Controller{ private static final String GO_BACK_CODE = "B"; private static final RouteController ROUTE_CONTROLLER = new RouteController(); @@ -17,7 +17,7 @@ public static RouteController getInstance() { return ROUTE_CONTROLLER; } - public String mappingRouteMenu(Scanner scanner) { + public String mappingMenu(Scanner scanner) { try { RouteOutputView.printRouteMenu(); String selectedOption = RouteInputView.inputRouteOption(scanner); @@ -25,7 +25,7 @@ public String mappingRouteMenu(Scanner scanner) { return selectedOption; } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); - return mappingRouteMenu(scanner); + return mappingMenu(scanner); } } diff --git a/src/main/java/subway/menus/MainMenu.java b/src/main/java/subway/menus/MainMenu.java index e687e62c7..3e985732a 100644 --- a/src/main/java/subway/menus/MainMenu.java +++ b/src/main/java/subway/menus/MainMenu.java @@ -28,7 +28,7 @@ public static void execute(String selectedOption, Scanner scanner) { .orElseThrow(() -> new IllegalArgumentException(OutputConstant.NOT_EXIST_OPTION_ERROR)) .routeController .get() - .mappingRouteMenu(scanner); + .mappingMenu(scanner); } @Override From 944a6aab54bab3a7615c1398dc572f9426581412 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 18:55:29 +0900 Subject: [PATCH 34/35] =?UTF-8?q?refactor:=20Distance=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=9D=98=20getDistance()=EC=99=80=20RequireResources?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20getDistance()=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=EC=9D=98=20=EC=9D=B4=EB=A6=84=20=EA=B5=AC?= =?UTF-8?q?=EB=B3=84=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit before: RequireResources클래스의 getDistance(), getTime() after: getDistanceResource(), getTimeResource() --- src/main/java/subway/domain/DistanceMap.java | 2 +- src/main/java/subway/domain/RequiredResources.java | 4 ++-- src/main/java/subway/domain/TimeMap.java | 2 +- src/main/java/subway/service/RouteService.java | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/subway/domain/DistanceMap.java b/src/main/java/subway/domain/DistanceMap.java index d2a626b1e..d035535e2 100644 --- a/src/main/java/subway/domain/DistanceMap.java +++ b/src/main/java/subway/domain/DistanceMap.java @@ -11,7 +11,7 @@ public class DistanceMap implements SubwayGraph{ public void addWeight() { Map sections = SectionRepository.sections(); sections.forEach((key, value) - -> subwayGraph.setEdgeWeight(subwayGraph.addEdge(key.getFirstStation(), key.getSecondStation()), value.getDistance().getDistance())); + -> subwayGraph.setEdgeWeight(subwayGraph.addEdge(key.getFirstStation(), key.getSecondStation()), value.getDistanceResource().getDistance())); } public List getShortestRoute(WeightedMultigraph graph, Station first, Station second) { diff --git a/src/main/java/subway/domain/RequiredResources.java b/src/main/java/subway/domain/RequiredResources.java index 44a933164..d1dc835b8 100644 --- a/src/main/java/subway/domain/RequiredResources.java +++ b/src/main/java/subway/domain/RequiredResources.java @@ -9,11 +9,11 @@ public RequiredResources(int distance, int time) { this.time = new Time(time); } - public Distance getDistance() { + public Distance getDistanceResource() { return distance; } - public Time getTime() { + public Time getTimeResource() { return time; } } diff --git a/src/main/java/subway/domain/TimeMap.java b/src/main/java/subway/domain/TimeMap.java index dcca1ba64..4af5a65b5 100644 --- a/src/main/java/subway/domain/TimeMap.java +++ b/src/main/java/subway/domain/TimeMap.java @@ -11,7 +11,7 @@ public class TimeMap implements SubwayGraph{ public void addWeight() { Map sections = SectionRepository.sections(); sections.forEach((key, value) - -> subwayGraph.setEdgeWeight(subwayGraph.addEdge(key.getFirstStation(), key.getSecondStation()), value.getTime().getTime())); + -> subwayGraph.setEdgeWeight(subwayGraph.addEdge(key.getFirstStation(), key.getSecondStation()), value.getTimeResource().getTime())); } public List getShortestRoute(WeightedMultigraph graph, Station first, Station second) { diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index 7e8e7077c..49c6a4392 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -57,7 +57,7 @@ default int calculateTotalDistance(List shortestRouteStationList) { int totalDistance = 0; for (int i = 0; i < shortestRouteStationList.size()-1 ; i++) { Section section = new Section(shortestRouteStationList.get(i), shortestRouteStationList.get(i + 1)); - totalDistance += SectionRepository.sections().get(section).getDistance().getDistance(); + totalDistance += SectionRepository.sections().get(section).getDistanceResource().getDistance(); } return totalDistance; } @@ -66,7 +66,7 @@ default int calculateTotalTime(List shortestRouteStationList) { int totalTime = 0; for (int i = 0; i < shortestRouteStationList.size()-1 ; i++) { Section section = new Section(shortestRouteStationList.get(i), shortestRouteStationList.get(i + 1)); - totalTime += SectionRepository.sections().get(section).getTime().getTime(); + totalTime += SectionRepository.sections().get(section).getTimeResource().getTime(); } return totalTime; } From 6382bbd44b546139ef926622c52a4cd957378c86 Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Dec 2020 18:58:13 +0900 Subject: [PATCH 35/35] =?UTF-8?q?refactor:=20=EC=97=90=EB=9F=AC=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5=ED=8F=AC=EB=A9=A7=20?= =?UTF-8?q?=EA=B3=B5=EB=B0=B1=EB=9D=BC=EC=9D=B8=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/subway/Application.java | 1 + src/main/java/subway/domain/SubwayGraph.java | 2 +- src/main/java/subway/service/RouteService.java | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index dc842a22b..e2e9fce0b 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -7,6 +7,7 @@ public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); + InitialSetting.settingInitialSubways(); MainController mainController = MainController.getInstance(); diff --git a/src/main/java/subway/domain/SubwayGraph.java b/src/main/java/subway/domain/SubwayGraph.java index a2337b4ff..3b37980a3 100644 --- a/src/main/java/subway/domain/SubwayGraph.java +++ b/src/main/java/subway/domain/SubwayGraph.java @@ -8,7 +8,7 @@ import java.util.List; public interface SubwayGraph { - String NOT_CONNECTED_STATION_MESSAGE = "\n[ERROR] 두 역은 연결되지 않았습니다."; + String NOT_CONNECTED_STATION_MESSAGE = "\n[ERROR] 두 역은 연결되지 않았습니다.\n"; WeightedMultigraph subwayGraph = new WeightedMultigraph(DefaultWeightedEdge.class); diff --git a/src/main/java/subway/service/RouteService.java b/src/main/java/subway/service/RouteService.java index 49c6a4392..f3e40cbac 100644 --- a/src/main/java/subway/service/RouteService.java +++ b/src/main/java/subway/service/RouteService.java @@ -12,8 +12,8 @@ import java.util.Scanner; public interface RouteService { - String NOT_EXIST_STATION_ERROR = "\n[ERROR] 존재하지 않는 역입니다."; - String SAME_STATION_ERROR = "\n[ERROR] 같은 역은 입력할 수 없습니다."; + String NOT_EXIST_STATION_ERROR = "\n[ERROR] 존재하지 않는 역입니다.\n"; + String SAME_STATION_ERROR = "\n[ERROR] 같은 역은 입력할 수 없습니다.\n"; void routingService(Scanner scanner);