From 8e01221f116c0b2ecbb7df9e93f4bf53059e3069 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 13:40:45 +0900 Subject: [PATCH 01/17] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 51 ++++++--------------------------------------------- 1 file changed, 6 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index d6299154c..e28754d94 100644 --- a/README.md +++ b/README.md @@ -200,52 +200,13 @@ public class StationRepository {
-## ❗️힌트 -### 최단 경로 라이브러리 -- jgrapht 라이브러리를 활용하면 간편하게 최단거리를 조회할 수 있음 -- Dijkstra 알고리즘을 반드시 이해할 필요는 없고 미션에 적용할 정도로만 이해하면 됨 -- JGraphtTest 클래스의 테스트를 활용하여 미션에 필요한 라이브러리의 기능을 학습할 수 있음 -- 정점(vertex)과 간선(edge), 그리고 가중치 개념을 이용 - - 정점: 지하철역 - - 간선: 지하철역 연결정보 - - 가중치: 거리 or 소요 시간 -- 최단 거리 기준 조회 시 가중치를 거리로 설정 +## 기능 구현 목록 +- Line 안에 Station list 변수 생성 및 추가 기능 구현 +- 구간 객체 생성 + - JGrapht 활용하여 시간, 거리 개념의 구간 정보 가짐 + - 최단거리, 최단시간 도출해내는 기능 구현 +- Line 객체가 구간 객체 가지도록 구현 -```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 From 51320cd228fd68f0c67ac31964b3e5eeb3705603 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 13:48:25 +0900 Subject: [PATCH 02/17] =?UTF-8?q?feat:=20Line=20=EC=95=88=EC=97=90=20stati?= =?UTF-8?q?onlist=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=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 --- src/main/java/subway/domain/Line.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..afe0bffe2 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,15 +1,27 @@ package subway.domain; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public class Line { private String name; + private List stationInLine = new ArrayList<>(); public Line(String name) { this.name = name; } + public void addStationInLine(Station station) { + stationInLine.add(station); + } + public String getName() { return name; } - // 추가 기능 구현 + public List stationsInLine() { + return Collections.unmodifiableList(stationInLine); + } + } From eddfdf10d472633e653c968d37d60f543326c679 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 14:21:42 +0900 Subject: [PATCH 03/17] =?UTF-8?q?feat:=20Interval=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EA=B2=BD=EB=A1=9C=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84,=20=EA=B1=B0=EB=A6=AC=20=EB=8F=84=EC=B6=9C=20?= =?UTF-8?q?=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 --- src/main/java/subway/domain/Interval.java | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/subway/domain/Interval.java diff --git a/src/main/java/subway/domain/Interval.java b/src/main/java/subway/domain/Interval.java new file mode 100644 index 000000000..c5ecab168 --- /dev/null +++ b/src/main/java/subway/domain/Interval.java @@ -0,0 +1,46 @@ +package subway.domain; + +import org.jgrapht.GraphPath; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; + +import java.util.List; + +public class Interval { + WeightedMultigraph distanceInterval = new WeightedMultigraph(DefaultWeightedEdge.class); + WeightedMultigraph timeInterval = new WeightedMultigraph(DefaultWeightedEdge.class); + + public Interval(List stationInLine, int[] distance, int[] time) { + for (Station station : stationInLine) { + distanceInterval.addVertex(station); + timeInterval.addVertex(station); + } + + for (int i = 0; i < stationInLine.size() - 1; i++) { + distanceInterval.setEdgeWeight(distanceInterval.addEdge(stationInLine.get(i), stationInLine.get(i + 1)), distance[i]); + timeInterval.setEdgeWeight(timeInterval.addEdge(stationInLine.get(i), stationInLine.get(i + 1)), time[i]); + } + } + + public List shortestDistancePath(Station start, Station end) { + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(distanceInterval); + return dijkstraShortestPath.getPath(start, end).getVertexList(); + } + + public int getTotalDistance(List path) { + int total = 0; + for (int i = 0; i < path.size() - 1; i++) { + total += distanceInterval.getEdgeWeight(distanceInterval.getEdge(path.get(i), path.get(i + 1))); + } + return total; + } + + public int getTotalTime(List path) { + int total = 0; + for (int i = 0; i < path.size() - 1; i++) { + total += timeInterval.getEdgeWeight(timeInterval.getEdge(path.get(i), path.get(i + 1))); + } + return total; + } +} From f27eee7604f6d9a48d5cd8d0912e623a9f2c0962 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 14:25:23 +0900 Subject: [PATCH 04/17] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e28754d94..02afb21c4 100644 --- a/README.md +++ b/README.md @@ -205,7 +205,11 @@ public class StationRepository { - 구간 객체 생성 - JGrapht 활용하여 시간, 거리 개념의 구간 정보 가짐 - 최단거리, 최단시간 도출해내는 기능 구현 -- Line 객체가 구간 객체 가지도록 구현 +- Line 객체가 구간 거리, 구간 시간 정보가지도록 구현 +- 초기화 작업 + - Manager 디렉토리 생성하여 초기화 작업하는 기능 구현 +- view 담당 디렉토리 생성 + - Input, Output, Error
From 9ca2a59db44d4912c36f22937fbab8b6f0007a90 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 14:34:17 +0900 Subject: [PATCH 05/17] =?UTF-8?q?Refactor:=20Interval=20static=EC=9C=BC?= =?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/domain/Interval.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/subway/domain/Interval.java b/src/main/java/subway/domain/Interval.java index c5ecab168..76b8a2b81 100644 --- a/src/main/java/subway/domain/Interval.java +++ b/src/main/java/subway/domain/Interval.java @@ -1,6 +1,5 @@ package subway.domain; -import org.jgrapht.GraphPath; import org.jgrapht.alg.shortestpath.DijkstraShortestPath; import org.jgrapht.graph.DefaultWeightedEdge; import org.jgrapht.graph.WeightedMultigraph; @@ -8,27 +7,28 @@ import java.util.List; public class Interval { - WeightedMultigraph distanceInterval = new WeightedMultigraph(DefaultWeightedEdge.class); - WeightedMultigraph timeInterval = new WeightedMultigraph(DefaultWeightedEdge.class); + private static WeightedMultigraph distanceInterval = new WeightedMultigraph(DefaultWeightedEdge.class); + private static WeightedMultigraph timeInterval = new WeightedMultigraph(DefaultWeightedEdge.class); - public Interval(List stationInLine, int[] distance, int[] time) { + public Interval(List stationInLine, List distance, List time) { for (Station station : stationInLine) { distanceInterval.addVertex(station); timeInterval.addVertex(station); } for (int i = 0; i < stationInLine.size() - 1; i++) { - distanceInterval.setEdgeWeight(distanceInterval.addEdge(stationInLine.get(i), stationInLine.get(i + 1)), distance[i]); - timeInterval.setEdgeWeight(timeInterval.addEdge(stationInLine.get(i), stationInLine.get(i + 1)), time[i]); + distanceInterval.setEdgeWeight(distanceInterval.addEdge(stationInLine.get(i), stationInLine.get(i + 1)), distance.get(i)); + timeInterval.setEdgeWeight(timeInterval.addEdge(stationInLine.get(i), stationInLine.get(i + 1)), distance.get(i)); } } - public List shortestDistancePath(Station start, Station end) { + public static List shortestDistancePath(Station start, Station end) { DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(distanceInterval); return dijkstraShortestPath.getPath(start, end).getVertexList(); } - public int getTotalDistance(List path) { + public static int getTotalDistance(Station start, Station end) { + List path = shortestDistancePath(start, end); int total = 0; for (int i = 0; i < path.size() - 1; i++) { total += distanceInterval.getEdgeWeight(distanceInterval.getEdge(path.get(i), path.get(i + 1))); @@ -36,7 +36,8 @@ public int getTotalDistance(List path) { return total; } - public int getTotalTime(List path) { + public static int getTotalTime(Station start, Station end) { + List path = shortestDistancePath(start, end); int total = 0; for (int i = 0; i < path.size() - 1; i++) { total += timeInterval.getEdgeWeight(timeInterval.getEdge(path.get(i), path.get(i + 1))); From b91f567f1f2344e22e8566bcfd817ff21282bdd3 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 14:45:38 +0900 Subject: [PATCH 06/17] =?UTF-8?q?feat:=20Line=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EA=B0=80=20=EA=B1=B0=EB=A6=AC,=20=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EA=B0=80=EC=A7=80=EB=8F=84=EB=A1=9D=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 --- src/main/java/subway/domain/Line.java | 23 ++++++++++++++++--- .../java/subway/domain/StationRepository.java | 7 ++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index afe0bffe2..717038b22 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -6,16 +6,33 @@ public class Line { private String name; - private List stationInLine = new ArrayList<>(); + private final List stationInLine = new ArrayList<>(); + private final List distanceInterval = new ArrayList<>(); + private final List timeInterval = new ArrayList<>(); - public Line(String name) { + public Line(String name, String[] stations, int[] distance, int[] time) { this.name = name; + for (String station : stations) { + addStationInLine(StationRepository.findStationByName(station)); + } + for (int i=0; i station.getName().equals(name)) + .findFirst() + .get(); + } + public static boolean deleteStation(String name) { return stations.removeIf(station -> Objects.equals(station.getName(), name)); } From 69744b345a79f123a9e2f463e0aade91c35cf59b Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 15:16:52 +0900 Subject: [PATCH 07/17] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95(=EC=97=AD,=20=EB=85=B8=EC=84=A0,=20=EA=B5=AC=EA=B0=84?= =?UTF-8?q?)=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 --- .../controller/InitializingManager.java | 41 +++++++++++++++++++ src/main/java/subway/domain/Interval.java | 4 +- src/main/java/subway/domain/Line.java | 6 ++- 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 src/main/java/subway/controller/InitializingManager.java diff --git a/src/main/java/subway/controller/InitializingManager.java b/src/main/java/subway/controller/InitializingManager.java new file mode 100644 index 000000000..727606753 --- /dev/null +++ b/src/main/java/subway/controller/InitializingManager.java @@ -0,0 +1,41 @@ +package subway.controller; + +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; + +public class InitializingManager { + private static final String[] defaultStations = {"교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"}; + private static final String[] defaultLines = {"2호선", "3호선", "신분당선"}; + private static final String[][] defaultInLineStations = {{"교대역", "강남역", "역삼역"}, {"교대역", "남부터미널역", "양재역", "매봉역"}, {"강남역", "양재역", "양재시민의숲역"}}; + + private static final int[][] defaultLineDistance = {{2, 2}, {3, 6, 1}, {2, 10}}; + private static final int[][] defaultLineTime = {{3, 3}, {2, 5, 1}, {8, 3}}; + + public static void initialize() { + initiateStation(); + initiateLine(); + initiateInterval(); + } + + private static void initiateStation() { + for (String station : defaultStations) { + StationRepository.addStation(new Station(station)); + } + } + + private static void initiateLine() { + for (int i = 0; i < defaultLines.length; i++) { + LineRepository.addLine( + new Line(defaultLines[i], defaultInLineStations[i], defaultLineDistance[i], defaultLineTime[i])); + } + } + + private static void initiateInterval() { + for (Line line : LineRepository.lines()) { + line.registerInterval(); + } + } + +} diff --git a/src/main/java/subway/domain/Interval.java b/src/main/java/subway/domain/Interval.java index 76b8a2b81..2c7fb56b6 100644 --- a/src/main/java/subway/domain/Interval.java +++ b/src/main/java/subway/domain/Interval.java @@ -10,7 +10,7 @@ public class Interval { private static WeightedMultigraph distanceInterval = new WeightedMultigraph(DefaultWeightedEdge.class); private static WeightedMultigraph timeInterval = new WeightedMultigraph(DefaultWeightedEdge.class); - public Interval(List stationInLine, List distance, List time) { + public static void registerIntervals(List stationInLine, List distance, List time) { for (Station station : stationInLine) { distanceInterval.addVertex(station); timeInterval.addVertex(station); @@ -18,7 +18,7 @@ public Interval(List stationInLine, List distance, List Date: Sat, 19 Dec 2020 15:22:36 +0900 Subject: [PATCH 08/17] =?UTF-8?q?refactor:=20Interval=20=EA=B1=B0=EB=A6=AC?= =?UTF-8?q?,=20=EC=8B=9C=EA=B0=84=EC=97=90=20=EB=94=B0=EB=9D=BC=20?= =?UTF-8?q?=EA=B0=92=20=EB=8F=84=EC=B6=9C=EB=90=A0=20=EC=88=98=20=EC=9E=88?= =?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/domain/Interval.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/subway/domain/Interval.java b/src/main/java/subway/domain/Interval.java index 2c7fb56b6..a3942d026 100644 --- a/src/main/java/subway/domain/Interval.java +++ b/src/main/java/subway/domain/Interval.java @@ -27,8 +27,12 @@ public static List shortestDistancePath(Station start, Station end) { return dijkstraShortestPath.getPath(start, end).getVertexList(); } - public static int getTotalDistance(Station start, Station end) { - List path = shortestDistancePath(start, end); + public static List shortestTimePath(Station start, Station end) { + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(timeInterval); + return dijkstraShortestPath.getPath(start, end).getVertexList(); + } + + public static int getTotalDistance(List path) { int total = 0; for (int i = 0; i < path.size() - 1; i++) { total += distanceInterval.getEdgeWeight(distanceInterval.getEdge(path.get(i), path.get(i + 1))); @@ -36,8 +40,7 @@ public static int getTotalDistance(Station start, Station end) { return total; } - public static int getTotalTime(Station start, Station end) { - List path = shortestDistancePath(start, end); + public static int getTotalTime(List path) { int total = 0; for (int i = 0; i < path.size() - 1; i++) { total += timeInterval.getEdgeWeight(timeInterval.getEdge(path.get(i), path.get(i + 1))); From 65b96794cb4e8360ab1af1282b5c4e9c94f576b3 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 15:26:00 +0900 Subject: [PATCH 09/17] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 02afb21c4..b5ea0a556 100644 --- a/README.md +++ b/README.md @@ -208,6 +208,8 @@ public class StationRepository { - Line 객체가 구간 거리, 구간 시간 정보가지도록 구현 - 초기화 작업 - Manager 디렉토리 생성하여 초기화 작업하는 기능 구현 +- Controller 생성하고 프로그램 실행 기능 구현 +- Menu 생성하여 버튼 동작 기능 구현 - view 담당 디렉토리 생성 - Input, Output, Error From 35e74c01750ad2a26671d4bdaa5e6ca1dc1ca2ea Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 15:57:30 +0900 Subject: [PATCH 10/17] =?UTF-8?q?feat:=20MenuRepository=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EB=A9=94=EB=89=B4=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/domain/MenuRepository.java | 19 +++++++++++++++++++ .../java/subway/menu/mainmenu/MainMenu.java | 5 +++++ .../java/subway/menu/mainmenu/QuitMenu.java | 6 ++++++ .../subway/menu/mainmenu/SearchPathMenu.java | 10 ++++++++++ 4 files changed, 40 insertions(+) create mode 100644 src/main/java/subway/domain/MenuRepository.java create mode 100644 src/main/java/subway/menu/mainmenu/MainMenu.java create mode 100644 src/main/java/subway/menu/mainmenu/QuitMenu.java create mode 100644 src/main/java/subway/menu/mainmenu/SearchPathMenu.java diff --git a/src/main/java/subway/domain/MenuRepository.java b/src/main/java/subway/domain/MenuRepository.java new file mode 100644 index 000000000..31a795c3c --- /dev/null +++ b/src/main/java/subway/domain/MenuRepository.java @@ -0,0 +1,19 @@ +package subway.domain; + +import subway.menu.mainmenu.MainMenu; +import subway.menu.mainmenu.QuitMenu; +import subway.menu.mainmenu.SearchPathMenu; + +import java.util.*; + +public class MenuRepository { + public static final List mainMenuButtons = new ArrayList<>(Arrays.asList(SearchPathMenu.MENU_BUTTON, QuitMenu.MENU_BUTTON)); +// public static final List searchMenuButtons; + + public static final Map mainMenu = new HashMap<>(); + + static { + mainMenu.put(SearchPathMenu.MENU_BUTTON, new SearchPathMenu()); + } + +} diff --git a/src/main/java/subway/menu/mainmenu/MainMenu.java b/src/main/java/subway/menu/mainmenu/MainMenu.java new file mode 100644 index 000000000..c41e80628 --- /dev/null +++ b/src/main/java/subway/menu/mainmenu/MainMenu.java @@ -0,0 +1,5 @@ +package subway.menu.mainmenu; + +public interface MainMenu { + void run(); +} diff --git a/src/main/java/subway/menu/mainmenu/QuitMenu.java b/src/main/java/subway/menu/mainmenu/QuitMenu.java new file mode 100644 index 000000000..fe78d575a --- /dev/null +++ b/src/main/java/subway/menu/mainmenu/QuitMenu.java @@ -0,0 +1,6 @@ +package subway.menu.mainmenu; + +public class QuitMenu { + public static final String MENU_BUTTON = "Q"; + public static final String MENU_NAME = "종료"; +} diff --git a/src/main/java/subway/menu/mainmenu/SearchPathMenu.java b/src/main/java/subway/menu/mainmenu/SearchPathMenu.java new file mode 100644 index 000000000..754e4225c --- /dev/null +++ b/src/main/java/subway/menu/mainmenu/SearchPathMenu.java @@ -0,0 +1,10 @@ +package subway.menu.mainmenu; + +public class SearchPathMenu implements MainMenu{ + public static final String MENU_BUTTON = "1"; + public static final String MENU_NAME = "경로 조회"; + + public void run() { + + } +} From eb2efdb9e74c667207e0718e8f774cb7fd3a4b57 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 16:09:49 +0900 Subject: [PATCH 11/17] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EC=9E=91=EB=8F=99=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 --- .../subway/controller/UserController.java | 30 +++++++++++++++++++ .../java/subway/domain/MenuRepository.java | 1 + .../subway/userinterface/ErrorOutput.java | 21 +++++++++++++ .../java/subway/userinterface/InfoOutput.java | 5 ++++ src/main/java/subway/userinterface/Input.java | 21 +++++++++++++ 5 files changed, 78 insertions(+) create mode 100644 src/main/java/subway/controller/UserController.java create mode 100644 src/main/java/subway/userinterface/ErrorOutput.java create mode 100644 src/main/java/subway/userinterface/InfoOutput.java create mode 100644 src/main/java/subway/userinterface/Input.java diff --git a/src/main/java/subway/controller/UserController.java b/src/main/java/subway/controller/UserController.java new file mode 100644 index 000000000..2013e374d --- /dev/null +++ b/src/main/java/subway/controller/UserController.java @@ -0,0 +1,30 @@ +package subway.controller; + +import subway.domain.MenuRepository; +import subway.userinterface.ErrorOutput; +import subway.userinterface.Input; + +public class UserController { + public static void start() { + InitializingManager.initialize(); + boolean runStatus = true; + while (runStatus) { + runStatus = startMainMenu(); + } + } + + private static boolean startMainMenu() { + String input = Input.newInput(); + if (ErrorOutput.isWrongMainMenuInput(input)) { + return true; + } + + for (String key : MenuRepository.mainMenu.keySet()) { + if (input.equals(key)) { + MenuRepository.mainMenu.get(key).run(); + return true; + } + } + return false; + } +} diff --git a/src/main/java/subway/domain/MenuRepository.java b/src/main/java/subway/domain/MenuRepository.java index 31a795c3c..3395aee9e 100644 --- a/src/main/java/subway/domain/MenuRepository.java +++ b/src/main/java/subway/domain/MenuRepository.java @@ -8,6 +8,7 @@ public class MenuRepository { public static final List mainMenuButtons = new ArrayList<>(Arrays.asList(SearchPathMenu.MENU_BUTTON, QuitMenu.MENU_BUTTON)); + public static final List mainMenuNames = new ArrayList<>(Arrays.asList(SearchPathMenu.MENU_NAME, QuitMenu.MENU_NAME)); // public static final List searchMenuButtons; public static final Map mainMenu = new HashMap<>(); diff --git a/src/main/java/subway/userinterface/ErrorOutput.java b/src/main/java/subway/userinterface/ErrorOutput.java new file mode 100644 index 000000000..91c094162 --- /dev/null +++ b/src/main/java/subway/userinterface/ErrorOutput.java @@ -0,0 +1,21 @@ +package subway.userinterface; + +import subway.domain.MenuRepository; + +public class ErrorOutput { + private static final String ERROR = "\n[ERROR] "; + + public static boolean returnStatus(boolean status) { + if (status) { + System.out.println(ERROR + "선택할 수 없는 기능입니다."); + } + return status; + } + + public static boolean isWrongMainMenuInput(String input) { + boolean status = MenuRepository.mainMenuButtons.stream().noneMatch(button -> button.equals(input)); + return returnStatus(status); + } + + +} diff --git a/src/main/java/subway/userinterface/InfoOutput.java b/src/main/java/subway/userinterface/InfoOutput.java new file mode 100644 index 000000000..ca7479643 --- /dev/null +++ b/src/main/java/subway/userinterface/InfoOutput.java @@ -0,0 +1,5 @@ +package subway.userinterface; + +public class InfoOutput { + private static final String INFO = "\n[INFO] "; +} diff --git a/src/main/java/subway/userinterface/Input.java b/src/main/java/subway/userinterface/Input.java new file mode 100644 index 000000000..0c0f1e173 --- /dev/null +++ b/src/main/java/subway/userinterface/Input.java @@ -0,0 +1,21 @@ +package subway.userinterface; + +import subway.domain.MenuRepository; + +import java.util.Scanner; + +public class Input { + private static Scanner scanner = new Scanner(System.in); + private static final String PREFIX = "\n## "; + + public static String newInput() { + return scanner.nextLine(); + } + + public static void printMainMenu() { + System.out.println(PREFIX+"메인 화면"); + for (int i=0; i< MenuRepository.mainMenuButtons.size(); i++) { + System.out.println(MenuRepository.mainMenuButtons.get(i) +". "+MenuRepository.mainMenuNames.get(i)); + } + } +} From 3747f217ee97a3bccc6565a2743cbbbbe9d44580 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 16:24:20 +0900 Subject: [PATCH 12/17] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=20=EA=B0=92?= =?UTF-8?q?=EB=8C=80=EB=A1=9C=20=EA=B2=BD=EB=A1=9C=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EC=84=A0=ED=83=9D=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 --- .../subway/controller/UserController.java | 3 ++- .../java/subway/domain/MenuRepository.java | 14 ++++++++++- .../subway/menu/mainmenu/SearchPathMenu.java | 23 +++++++++++++++++++ .../java/subway/menu/searchmenu/ExitMenu.java | 7 ++++++ .../subway/menu/searchmenu/SearchMenu.java | 5 ++++ .../SearchShortestDistanceMenu.java | 12 ++++++++++ .../searchmenu/SearchShortestTimeMenu.java | 12 ++++++++++ .../subway/userinterface/ErrorOutput.java | 5 ++++ src/main/java/subway/userinterface/Input.java | 7 ++++++ 9 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 src/main/java/subway/menu/searchmenu/ExitMenu.java create mode 100644 src/main/java/subway/menu/searchmenu/SearchMenu.java create mode 100644 src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java create mode 100644 src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java diff --git a/src/main/java/subway/controller/UserController.java b/src/main/java/subway/controller/UserController.java index 2013e374d..f2fe929e9 100644 --- a/src/main/java/subway/controller/UserController.java +++ b/src/main/java/subway/controller/UserController.java @@ -9,12 +9,13 @@ public static void start() { InitializingManager.initialize(); boolean runStatus = true; while (runStatus) { + Input.printMainMenu(); runStatus = startMainMenu(); } } private static boolean startMainMenu() { - String input = Input.newInput(); + String input = Input.newInput().toUpperCase(); if (ErrorOutput.isWrongMainMenuInput(input)) { return true; } diff --git a/src/main/java/subway/domain/MenuRepository.java b/src/main/java/subway/domain/MenuRepository.java index 3395aee9e..237a9cf02 100644 --- a/src/main/java/subway/domain/MenuRepository.java +++ b/src/main/java/subway/domain/MenuRepository.java @@ -3,18 +3,30 @@ import subway.menu.mainmenu.MainMenu; import subway.menu.mainmenu.QuitMenu; import subway.menu.mainmenu.SearchPathMenu; +import subway.menu.searchmenu.ExitMenu; +import subway.menu.searchmenu.SearchMenu; +import subway.menu.searchmenu.SearchShortestDistanceMenu; +import subway.menu.searchmenu.SearchShortestTimeMenu; import java.util.*; public class MenuRepository { public static final List mainMenuButtons = new ArrayList<>(Arrays.asList(SearchPathMenu.MENU_BUTTON, QuitMenu.MENU_BUTTON)); + public static final List searchMenuButtons = new ArrayList<>( + Arrays.asList(SearchShortestDistanceMenu.MENU_BUTTON, SearchShortestTimeMenu.MENU_BUTTON, ExitMenu.MENU_BUTTON)); + public static final List mainMenuNames = new ArrayList<>(Arrays.asList(SearchPathMenu.MENU_NAME, QuitMenu.MENU_NAME)); -// public static final List searchMenuButtons; + public static final List searchMenuNames = new ArrayList<>( + Arrays.asList(SearchShortestDistanceMenu.MENU_NAME, SearchShortestTimeMenu.MENU_NAME, ExitMenu.MENU_NAME)); public static final Map mainMenu = new HashMap<>(); + public static final Map searchMenu = new HashMap<>(); static { mainMenu.put(SearchPathMenu.MENU_BUTTON, new SearchPathMenu()); + + searchMenu.put(SearchShortestDistanceMenu.MENU_BUTTON, new SearchShortestDistanceMenu()); + searchMenu.put(SearchShortestTimeMenu.MENU_BUTTON, new SearchShortestTimeMenu()); } } diff --git a/src/main/java/subway/menu/mainmenu/SearchPathMenu.java b/src/main/java/subway/menu/mainmenu/SearchPathMenu.java index 754e4225c..dc4d03f14 100644 --- a/src/main/java/subway/menu/mainmenu/SearchPathMenu.java +++ b/src/main/java/subway/menu/mainmenu/SearchPathMenu.java @@ -1,10 +1,33 @@ package subway.menu.mainmenu; +import subway.domain.MenuRepository; +import subway.userinterface.ErrorOutput; +import subway.userinterface.Input; + public class SearchPathMenu implements MainMenu{ public static final String MENU_BUTTON = "1"; public static final String MENU_NAME = "경로 조회"; public void run() { + boolean runStatus = true; + while(runStatus) { + Input.printSearchMenu(); + runStatus = runSearchMenu(); + } + } + + private boolean runSearchMenu() { + String input = Input.newInput().toUpperCase(); + if (ErrorOutput.isWrongSearchMenuInput(input)) { + return true; + } + for (String key : MenuRepository.searchMenu.keySet()) { + if (input.equals(key)) { + MenuRepository.searchMenu.get(key).run(); + return true; + } + } + return false; } } diff --git a/src/main/java/subway/menu/searchmenu/ExitMenu.java b/src/main/java/subway/menu/searchmenu/ExitMenu.java new file mode 100644 index 000000000..4af9e50e6 --- /dev/null +++ b/src/main/java/subway/menu/searchmenu/ExitMenu.java @@ -0,0 +1,7 @@ +package subway.menu.searchmenu; + +public class ExitMenu { + public static final String MENU_BUTTON = "B"; + public static final String MENU_NAME = "돌아가기"; + +} diff --git a/src/main/java/subway/menu/searchmenu/SearchMenu.java b/src/main/java/subway/menu/searchmenu/SearchMenu.java new file mode 100644 index 000000000..2eddf4774 --- /dev/null +++ b/src/main/java/subway/menu/searchmenu/SearchMenu.java @@ -0,0 +1,5 @@ +package subway.menu.searchmenu; + +public interface SearchMenu { + void run(); +} diff --git a/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java b/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java new file mode 100644 index 000000000..b137d93be --- /dev/null +++ b/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java @@ -0,0 +1,12 @@ +package subway.menu.searchmenu; + +public class SearchShortestDistanceMenu implements SearchMenu{ + public static final String MENU_BUTTON = "1"; + public static final String MENU_NAME = "최단 거리"; + + + @Override + public void run() { + + } +} diff --git a/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java b/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java new file mode 100644 index 000000000..fae45fcbe --- /dev/null +++ b/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java @@ -0,0 +1,12 @@ +package subway.menu.searchmenu; + +public class SearchShortestTimeMenu implements SearchMenu{ + public static final String MENU_BUTTON = "2"; + public static final String MENU_NAME = "최단 시간"; + + + @Override + public void run() { + + } +} diff --git a/src/main/java/subway/userinterface/ErrorOutput.java b/src/main/java/subway/userinterface/ErrorOutput.java index 91c094162..d4b10a8e8 100644 --- a/src/main/java/subway/userinterface/ErrorOutput.java +++ b/src/main/java/subway/userinterface/ErrorOutput.java @@ -17,5 +17,10 @@ public static boolean isWrongMainMenuInput(String input) { return returnStatus(status); } + public static boolean isWrongSearchMenuInput(String input) { + boolean status = MenuRepository.searchMenuButtons.stream().noneMatch(button -> button.equals(input)); + return returnStatus(status); + } + } diff --git a/src/main/java/subway/userinterface/Input.java b/src/main/java/subway/userinterface/Input.java index 0c0f1e173..3b3c76f57 100644 --- a/src/main/java/subway/userinterface/Input.java +++ b/src/main/java/subway/userinterface/Input.java @@ -18,4 +18,11 @@ public static void printMainMenu() { System.out.println(MenuRepository.mainMenuButtons.get(i) +". "+MenuRepository.mainMenuNames.get(i)); } } + + public static void printSearchMenu() { + System.out.println(PREFIX+"경로 기준"); + for (int i=0; i< MenuRepository.mainMenuButtons.size(); i++) { + System.out.println(MenuRepository.searchMenuButtons.get(i) +". "+MenuRepository.searchMenuNames.get(i)); + } + } } From 7d98179e48e8e65a77b4c3dea1880826099a0281 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 16:56:21 +0900 Subject: [PATCH 13/17] =?UTF-8?q?feat:=20=EC=B5=9C=EB=8B=A8=20=EA=B1=B0?= =?UTF-8?q?=EB=A6=AC=20=EA=B2=BD=EB=A1=9C=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=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 --- .../java/subway/domain/StationRepository.java | 4 +++ .../SearchShortestDistanceMenu.java | 36 +++++++++++++++++-- .../subway/userinterface/ErrorOutput.java | 17 +++++++++ .../java/subway/userinterface/InfoOutput.java | 18 +++++++++- src/main/java/subway/userinterface/Input.java | 27 ++++++++++---- 5 files changed, 93 insertions(+), 9 deletions(-) diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index 0ced5d775..f15aa4820 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -27,6 +27,10 @@ public static boolean deleteStation(String name) { return stations.removeIf(station -> Objects.equals(station.getName(), name)); } + public static boolean isStationPresent(String name) { + return stations.stream().anyMatch(station -> station.getName().equals(name)); + } + public static void deleteAll() { stations.clear(); } diff --git a/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java b/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java index b137d93be..23db71a19 100644 --- a/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java +++ b/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java @@ -1,12 +1,44 @@ package subway.menu.searchmenu; -public class SearchShortestDistanceMenu implements SearchMenu{ +import subway.domain.Interval; +import subway.domain.Station; +import subway.domain.StationRepository; +import subway.userinterface.ErrorOutput; +import subway.userinterface.InfoOutput; +import subway.userinterface.Input; + +import java.util.List; + +public class SearchShortestDistanceMenu implements SearchMenu { public static final String MENU_BUTTON = "1"; public static final String MENU_NAME = "최단 거리"; - @Override public void run() { + checkStationInput(); + } + + private void checkStationInput() { + Input.printStartStation(); + String startInput = Input.newInput(); + if (ErrorOutput.printWrongStationInput(startInput)) { + return; + } + + Input.printEndStation(); + String endInput = Input.newInput(); + if (ErrorOutput.printWrongStationInput(endInput) || ErrorOutput.printSameStationNameError(startInput, endInput)) { + return; + } + + searchPath(startInput, endInput); + } + + private void searchPath(String startInput, String endInput) { + Station startStation = StationRepository.findStationByName(startInput); + Station endStation = StationRepository.findStationByName(endInput); + List shortestList = Interval.shortestDistancePath(startStation, endStation); + InfoOutput.printSearchResult(Interval.getTotalDistance(shortestList), Interval.getTotalTime(shortestList), shortestList); } } diff --git a/src/main/java/subway/userinterface/ErrorOutput.java b/src/main/java/subway/userinterface/ErrorOutput.java index d4b10a8e8..b6a838e0f 100644 --- a/src/main/java/subway/userinterface/ErrorOutput.java +++ b/src/main/java/subway/userinterface/ErrorOutput.java @@ -1,6 +1,7 @@ package subway.userinterface; import subway.domain.MenuRepository; +import subway.domain.StationRepository; public class ErrorOutput { private static final String ERROR = "\n[ERROR] "; @@ -22,5 +23,21 @@ public static boolean isWrongSearchMenuInput(String input) { return returnStatus(status); } + public static boolean printWrongStationInput(String input) { + if (!StationRepository.isStationPresent(input)) { + System.out.println(ERROR+"존재하지 않는 역 이름입니다."); + return true; + } + return false; + } + + public static boolean printSameStationNameError(String start, String end) { + if (start.equals(end)) { + System.out.println(ERROR +"출발역과 도착역이 동일합니다."); + return true; + } + return false; + } + } diff --git a/src/main/java/subway/userinterface/InfoOutput.java b/src/main/java/subway/userinterface/InfoOutput.java index ca7479643..e15f7acd8 100644 --- a/src/main/java/subway/userinterface/InfoOutput.java +++ b/src/main/java/subway/userinterface/InfoOutput.java @@ -1,5 +1,21 @@ package subway.userinterface; +import subway.domain.Station; + +import java.util.List; + public class InfoOutput { - private static final String INFO = "\n[INFO] "; + private static final String INFO = "[INFO] "; + private static final String LINE_DIVISION = "---"; + + public static void printSearchResult(int distance, int time, List stations) { + Input.printResultNotification(); + System.out.println(LINE_DIVISION); + System.out.println(INFO+"총 거리 : "+ distance+"km"); + System.out.println(INFO+"총 시간 : "+ distance+"분"); + System.out.println(LINE_DIVISION); + for (Station station : stations) { + System.out.println(INFO+station.getName()); + } + } } diff --git a/src/main/java/subway/userinterface/Input.java b/src/main/java/subway/userinterface/Input.java index 3b3c76f57..a2603ecd4 100644 --- a/src/main/java/subway/userinterface/Input.java +++ b/src/main/java/subway/userinterface/Input.java @@ -7,22 +7,37 @@ public class Input { private static Scanner scanner = new Scanner(System.in); private static final String PREFIX = "\n## "; + private static final String CHOOSE_MENU = PREFIX + "원하는 기능을 선택하세요."; public static String newInput() { return scanner.nextLine(); } + public static void printResultNotification() { + System.out.println(PREFIX+"조회 결과"); + } + public static void printMainMenu() { - System.out.println(PREFIX+"메인 화면"); - for (int i=0; i< MenuRepository.mainMenuButtons.size(); i++) { - System.out.println(MenuRepository.mainMenuButtons.get(i) +". "+MenuRepository.mainMenuNames.get(i)); + System.out.println(PREFIX + "메인 화면"); + for (int i = 0; i < MenuRepository.mainMenuButtons.size(); i++) { + System.out.println(MenuRepository.mainMenuButtons.get(i) + ". " + MenuRepository.mainMenuNames.get(i)); } + System.out.println(CHOOSE_MENU); } public static void printSearchMenu() { - System.out.println(PREFIX+"경로 기준"); - for (int i=0; i< MenuRepository.mainMenuButtons.size(); i++) { - System.out.println(MenuRepository.searchMenuButtons.get(i) +". "+MenuRepository.searchMenuNames.get(i)); + System.out.println(PREFIX + "경로 기준"); + for (int i = 0; i < MenuRepository.searchMenuButtons.size(); i++) { + System.out.println(MenuRepository.searchMenuButtons.get(i) + ". " + MenuRepository.searchMenuNames.get(i)); } + System.out.println(CHOOSE_MENU); + } + + public static void printStartStation() { + System.out.println(PREFIX + "출발역을 입력하세요"); + } + + public static void printEndStation() { + System.out.println(PREFIX + "도착역을 입력하세요"); } } From 5a628d7cbd3baa924c9cde579207d5f7b25101d4 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 17:18:27 +0900 Subject: [PATCH 14/17] =?UTF-8?q?feat:=20=EC=B5=9C=EB=8B=A8=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EA=B2=BD=EB=A1=9C=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=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 --- src/main/java/subway/domain/Interval.java | 4 +-- .../SearchShortestDistanceMenu.java | 4 +-- .../searchmenu/SearchShortestTimeMenu.java | 33 +++++++++++++++++++ .../java/subway/userinterface/InfoOutput.java | 6 ++-- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/main/java/subway/domain/Interval.java b/src/main/java/subway/domain/Interval.java index a3942d026..40e19d6cf 100644 --- a/src/main/java/subway/domain/Interval.java +++ b/src/main/java/subway/domain/Interval.java @@ -7,8 +7,8 @@ import java.util.List; public class Interval { - private static WeightedMultigraph distanceInterval = new WeightedMultigraph(DefaultWeightedEdge.class); - private static WeightedMultigraph timeInterval = new WeightedMultigraph(DefaultWeightedEdge.class); + public static WeightedMultigraph distanceInterval = new WeightedMultigraph(DefaultWeightedEdge.class); + public static WeightedMultigraph timeInterval = new WeightedMultigraph(DefaultWeightedEdge.class); public static void registerIntervals(List stationInLine, List distance, List time) { for (Station station : stationInLine) { diff --git a/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java b/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java index 23db71a19..444736c61 100644 --- a/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java +++ b/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java @@ -37,8 +37,8 @@ private void checkStationInput() { private void searchPath(String startInput, String endInput) { Station startStation = StationRepository.findStationByName(startInput); Station endStation = StationRepository.findStationByName(endInput); - List shortestList = Interval.shortestDistancePath(startStation, endStation); + List shortestPath = Interval.shortestDistancePath(startStation, endStation); - InfoOutput.printSearchResult(Interval.getTotalDistance(shortestList), Interval.getTotalTime(shortestList), shortestList); + InfoOutput.printSearchResult(Interval.getTotalDistance(shortestPath), Interval.getTotalTime(shortestPath), shortestPath); } } diff --git a/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java b/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java index fae45fcbe..dee398ff6 100644 --- a/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java +++ b/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java @@ -1,5 +1,14 @@ package subway.menu.searchmenu; +import subway.domain.Interval; +import subway.domain.Station; +import subway.domain.StationRepository; +import subway.userinterface.ErrorOutput; +import subway.userinterface.InfoOutput; +import subway.userinterface.Input; + +import java.util.List; + public class SearchShortestTimeMenu implements SearchMenu{ public static final String MENU_BUTTON = "2"; public static final String MENU_NAME = "최단 시간"; @@ -7,6 +16,30 @@ public class SearchShortestTimeMenu implements SearchMenu{ @Override public void run() { + checkStationInput(); + } + + private void checkStationInput() { + Input.printStartStation(); + String startInput = Input.newInput(); + if (ErrorOutput.printWrongStationInput(startInput)) { + return; + } + + Input.printEndStation(); + String endInput = Input.newInput(); + if (ErrorOutput.printWrongStationInput(endInput) || ErrorOutput.printSameStationNameError(startInput, endInput)) { + return; + } + + searchPath(startInput, endInput); + } + + private void searchPath(String startInput, String endInput) { + Station startStation = StationRepository.findStationByName(startInput); + Station endStation = StationRepository.findStationByName(endInput); + List shortestPath = Interval.shortestTimePath(startStation, endStation); + InfoOutput.printSearchResult(Interval.getTotalDistance(shortestPath), Interval.getTotalTime(shortestPath), shortestPath); } } diff --git a/src/main/java/subway/userinterface/InfoOutput.java b/src/main/java/subway/userinterface/InfoOutput.java index e15f7acd8..8b137f9eb 100644 --- a/src/main/java/subway/userinterface/InfoOutput.java +++ b/src/main/java/subway/userinterface/InfoOutput.java @@ -11,11 +11,11 @@ public class InfoOutput { public static void printSearchResult(int distance, int time, List stations) { Input.printResultNotification(); System.out.println(LINE_DIVISION); - System.out.println(INFO+"총 거리 : "+ distance+"km"); - System.out.println(INFO+"총 시간 : "+ distance+"분"); + System.out.println(INFO + "총 거리 : " + distance + "km"); + System.out.println(INFO + "총 시간 : " + time + "분"); System.out.println(LINE_DIVISION); for (Station station : stations) { - System.out.println(INFO+station.getName()); + System.out.println(INFO + station.getName()); } } } From 0f029a8ad4f095fdbca436b6bd2f28b4d6fc55fb Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 17:32:26 +0900 Subject: [PATCH 15/17] =?UTF-8?q?feat:=20=EC=97=B0=EA=B2=B0=20=EB=90=98?= =?UTF-8?q?=EC=96=B4=EC=9E=88=EC=A7=80=20=EC=95=8A=EC=9D=84=20=EB=95=8C=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=B6=9C=EB=A0=A5=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 --- .../subway/controller/InitializingManager.java | 3 ++- .../searchmenu/SearchShortestDistanceMenu.java | 13 +++++++++---- .../menu/searchmenu/SearchShortestTimeMenu.java | 14 +++++++++----- .../java/subway/userinterface/ErrorOutput.java | 4 ++++ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/subway/controller/InitializingManager.java b/src/main/java/subway/controller/InitializingManager.java index 727606753..135ad0d1b 100644 --- a/src/main/java/subway/controller/InitializingManager.java +++ b/src/main/java/subway/controller/InitializingManager.java @@ -8,7 +8,8 @@ public class InitializingManager { private static final String[] defaultStations = {"교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"}; private static final String[] defaultLines = {"2호선", "3호선", "신분당선"}; - private static final String[][] defaultInLineStations = {{"교대역", "강남역", "역삼역"}, {"교대역", "남부터미널역", "양재역", "매봉역"}, {"강남역", "양재역", "양재시민의숲역"}}; + private static final String[][] defaultInLineStations = {{"교대역", "강남역", "역삼역"}, {"교대역", "남부터미널역", "양재역", "매봉역"}, + {"강남역", "양재역", "양재시민의숲역"}}; private static final int[][] defaultLineDistance = {{2, 2}, {3, 6, 1}, {2, 10}}; private static final int[][] defaultLineTime = {{3, 3}, {2, 5, 1}, {8, 3}}; diff --git a/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java b/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java index 444736c61..863cdf291 100644 --- a/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java +++ b/src/main/java/subway/menu/searchmenu/SearchShortestDistanceMenu.java @@ -35,10 +35,15 @@ private void checkStationInput() { } private void searchPath(String startInput, String endInput) { - Station startStation = StationRepository.findStationByName(startInput); - Station endStation = StationRepository.findStationByName(endInput); - List shortestPath = Interval.shortestDistancePath(startStation, endStation); + try { + Station startStation = StationRepository.findStationByName(startInput); + Station endStation = StationRepository.findStationByName(endInput); + List shortestPath = Interval.shortestDistancePath(startStation, endStation); + + InfoOutput.printSearchResult(Interval.getTotalDistance(shortestPath), Interval.getTotalTime(shortestPath), shortestPath); + } catch (Exception e) { + ErrorOutput.printNotConnectedError(); + } - InfoOutput.printSearchResult(Interval.getTotalDistance(shortestPath), Interval.getTotalTime(shortestPath), shortestPath); } } diff --git a/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java b/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java index dee398ff6..6eb54fcd0 100644 --- a/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java +++ b/src/main/java/subway/menu/searchmenu/SearchShortestTimeMenu.java @@ -36,10 +36,14 @@ private void checkStationInput() { } private void searchPath(String startInput, String endInput) { - Station startStation = StationRepository.findStationByName(startInput); - Station endStation = StationRepository.findStationByName(endInput); - List shortestPath = Interval.shortestTimePath(startStation, endStation); - - InfoOutput.printSearchResult(Interval.getTotalDistance(shortestPath), Interval.getTotalTime(shortestPath), shortestPath); + try { + Station startStation = StationRepository.findStationByName(startInput); + Station endStation = StationRepository.findStationByName(endInput); + List shortestPath = Interval.shortestTimePath(startStation, endStation); + + InfoOutput.printSearchResult(Interval.getTotalDistance(shortestPath), Interval.getTotalTime(shortestPath), shortestPath); + } catch (Exception e) { + ErrorOutput.printNotConnectedError(); + } } } diff --git a/src/main/java/subway/userinterface/ErrorOutput.java b/src/main/java/subway/userinterface/ErrorOutput.java index b6a838e0f..fc46eb993 100644 --- a/src/main/java/subway/userinterface/ErrorOutput.java +++ b/src/main/java/subway/userinterface/ErrorOutput.java @@ -39,5 +39,9 @@ public static boolean printSameStationNameError(String start, String end) { return false; } + public static void printNotConnectedError() { + System.out.println(ERROR+"출발역과 도착역이 서로 연결되어있지 않습니다."); + } + } From 6a54e4ce21f9704347d16fd44189db4b9f934ad4 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 17:41:07 +0900 Subject: [PATCH 16/17] =?UTF-8?q?refactor:=20=EC=B6=9C=EB=A0=A5=EB=AC=B8?= =?UTF-8?q?=20=EC=83=81=EC=88=98=EB=A1=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/Application.java | 5 ++--- .../java/subway/userinterface/ErrorOutput.java | 12 ++++++++---- .../java/subway/userinterface/InfoOutput.java | 8 ++++++-- src/main/java/subway/userinterface/Input.java | 16 +++++++++++----- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..bc47c1233 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,9 @@ package subway; -import java.util.Scanner; +import subway.controller.UserController; public class Application { public static void main(String[] args) { - final Scanner scanner = new Scanner(System.in); - // TODO: 프로그램 구현 + UserController.start(); } } diff --git a/src/main/java/subway/userinterface/ErrorOutput.java b/src/main/java/subway/userinterface/ErrorOutput.java index fc46eb993..d60d7b62e 100644 --- a/src/main/java/subway/userinterface/ErrorOutput.java +++ b/src/main/java/subway/userinterface/ErrorOutput.java @@ -5,10 +5,14 @@ public class ErrorOutput { private static final String ERROR = "\n[ERROR] "; + private static final String NOT_EXISTING_STATION = "존재하지 않는 역 이름입니다."; + private static final String SAME_START_END_INPUT = "출발역과 도착역이 동일합니다."; + private static final String START_END_NOT_CONNECTED = "출발역과 도착역이 서로 연결되어있지 않습니다."; + private static final String INPUT_ERROR = "선택할 수 없는 기능입니다."; public static boolean returnStatus(boolean status) { if (status) { - System.out.println(ERROR + "선택할 수 없는 기능입니다."); + System.out.println(ERROR + INPUT_ERROR); } return status; } @@ -25,7 +29,7 @@ public static boolean isWrongSearchMenuInput(String input) { public static boolean printWrongStationInput(String input) { if (!StationRepository.isStationPresent(input)) { - System.out.println(ERROR+"존재하지 않는 역 이름입니다."); + System.out.println(ERROR + NOT_EXISTING_STATION); return true; } return false; @@ -33,14 +37,14 @@ public static boolean printWrongStationInput(String input) { public static boolean printSameStationNameError(String start, String end) { if (start.equals(end)) { - System.out.println(ERROR +"출발역과 도착역이 동일합니다."); + System.out.println(ERROR + SAME_START_END_INPUT); return true; } return false; } public static void printNotConnectedError() { - System.out.println(ERROR+"출발역과 도착역이 서로 연결되어있지 않습니다."); + System.out.println(ERROR + START_END_NOT_CONNECTED); } diff --git a/src/main/java/subway/userinterface/InfoOutput.java b/src/main/java/subway/userinterface/InfoOutput.java index 8b137f9eb..6c36ee2b5 100644 --- a/src/main/java/subway/userinterface/InfoOutput.java +++ b/src/main/java/subway/userinterface/InfoOutput.java @@ -7,12 +7,16 @@ public class InfoOutput { private static final String INFO = "[INFO] "; private static final String LINE_DIVISION = "---"; + private static final String TOTAL_DISTANCE = "총 거리 : "; + private static final String TOTAL_TIME = "총 시간 : "; + private static final String DISTANCE_UNIT = "km"; + private static final String TIME_UNIT = "분"; public static void printSearchResult(int distance, int time, List stations) { Input.printResultNotification(); System.out.println(LINE_DIVISION); - System.out.println(INFO + "총 거리 : " + distance + "km"); - System.out.println(INFO + "총 시간 : " + time + "분"); + System.out.println(INFO + TOTAL_DISTANCE + distance + DISTANCE_UNIT); + System.out.println(INFO + TOTAL_TIME + time + TIME_UNIT); System.out.println(LINE_DIVISION); for (Station station : stations) { System.out.println(INFO + station.getName()); diff --git a/src/main/java/subway/userinterface/Input.java b/src/main/java/subway/userinterface/Input.java index a2603ecd4..d8d14fbda 100644 --- a/src/main/java/subway/userinterface/Input.java +++ b/src/main/java/subway/userinterface/Input.java @@ -6,7 +6,13 @@ public class Input { private static Scanner scanner = new Scanner(System.in); + private static final String PREFIX = "\n## "; + private static final String RESULT_NOTIFICATION = "조회 결과"; + private static final String MAIN_MENU = "메인 화면"; + private static final String SEARCH_MENU = "경로 기준"; + private static final String START_STATION_INPUT = "출발역을 입력하세요"; + private static final String END_STATION_INPUT = "도착역을 입력하세요"; private static final String CHOOSE_MENU = PREFIX + "원하는 기능을 선택하세요."; public static String newInput() { @@ -14,11 +20,11 @@ public static String newInput() { } public static void printResultNotification() { - System.out.println(PREFIX+"조회 결과"); + System.out.println(PREFIX + RESULT_NOTIFICATION); } public static void printMainMenu() { - System.out.println(PREFIX + "메인 화면"); + System.out.println(PREFIX + MAIN_MENU); for (int i = 0; i < MenuRepository.mainMenuButtons.size(); i++) { System.out.println(MenuRepository.mainMenuButtons.get(i) + ". " + MenuRepository.mainMenuNames.get(i)); } @@ -26,7 +32,7 @@ public static void printMainMenu() { } public static void printSearchMenu() { - System.out.println(PREFIX + "경로 기준"); + System.out.println(PREFIX + SEARCH_MENU); for (int i = 0; i < MenuRepository.searchMenuButtons.size(); i++) { System.out.println(MenuRepository.searchMenuButtons.get(i) + ". " + MenuRepository.searchMenuNames.get(i)); } @@ -34,10 +40,10 @@ public static void printSearchMenu() { } public static void printStartStation() { - System.out.println(PREFIX + "출발역을 입력하세요"); + System.out.println(PREFIX + START_STATION_INPUT); } public static void printEndStation() { - System.out.println(PREFIX + "도착역을 입력하세요"); + System.out.println(PREFIX + END_STATION_INPUT); } } From 1e26ec989b931b7ad1bece1a95a3e80fa434a7b2 Mon Sep 17 00:00:00 2001 From: Sehwan_Jang Date: Sat, 19 Dec 2020 17:46:07 +0900 Subject: [PATCH 17/17] =?UTF-8?q?feat:=20Scanner=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=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/controller/UserController.java | 1 + src/main/java/subway/userinterface/Input.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/subway/controller/UserController.java b/src/main/java/subway/controller/UserController.java index f2fe929e9..143152c0a 100644 --- a/src/main/java/subway/controller/UserController.java +++ b/src/main/java/subway/controller/UserController.java @@ -12,6 +12,7 @@ public static void start() { Input.printMainMenu(); runStatus = startMainMenu(); } + Input.closeScanner(); } private static boolean startMainMenu() { diff --git a/src/main/java/subway/userinterface/Input.java b/src/main/java/subway/userinterface/Input.java index d8d14fbda..b5c7913f1 100644 --- a/src/main/java/subway/userinterface/Input.java +++ b/src/main/java/subway/userinterface/Input.java @@ -46,4 +46,8 @@ public static void printStartStation() { public static void printEndStation() { System.out.println(PREFIX + END_STATION_INPUT); } + + public static void closeScanner() { + scanner.close(); + } }