From 01dac4c34997aff56401dbe9b8b7df2a40b90c71 Mon Sep 17 00:00:00 2001 From: Junroot Date: Sat, 19 Dec 2020 13:23:41 +0900 Subject: [PATCH 1/7] =?UTF-8?q?docs(README):=20=EA=B5=AC=ED=98=84=ED=95=B4?= =?UTF-8?q?=EC=95=BC=20=EB=90=A0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index d6299154c..1269c4be5 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,22 @@
+## ✅ 구현할 기능 목록 +- [ ] 지하철 노선도 경로 조회 인터페이스 + - [입출력 요구사항](#-입출력-요구사항)의 양식에 맞추어 출력을 한다. + - 존재하지 않는 기능의 입력이면 에러를 출력한다. +- [ ] 구간 모델 구현 + - 구간에는 노선의 이름, 역 사이의 거리와 시간이 필요하다. +- [ ] 구간 Repository 구현 + - 모든 구간들을 관리할 수 있는 Repository를 구현한다. +- [ ] 초기 설정 구현 + - [기능 요구사항](#-기능-요구사항)에따라 초기 설정을 하도록 구현한다. +- [ ] 최단 경로 기능의 입력 구현 + - 존재하지 않은 역의 입력인 경우 예외 처리 + - 출발역과 도착역이 같은 경우 예외 처리 +- [ ] 최단 경로 기능 구현 + - 출발역과 도착역이 연결되어 있지 않으면 예외 처리 + ## 🚀 기능 요구사항 > 프리코스 3주차 미션에서 사용한 코드를 참고해도 무관하다. From a1a424b647dff4ec9c9bf708af5bca151547398d Mon Sep 17 00:00:00 2001 From: Junroot Date: Sat, 19 Dec 2020 15:20:53 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98=EC=B2=A0?= =?UTF-8?q?=20=EB=85=B8=EC=84=A0=EB=8F=84=20=EA=B2=BD=EB=A1=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=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 Controller 추가 - Main, MainView, SectionView, View Menu enum 추가 - Main, SectionMenu View 추가 - Main, Section --- README.md | 2 +- src/main/java/subway/Application.java | 6 ++- src/main/java/subway/Error.java | 15 ++++++ src/main/java/subway/Scene.java | 48 +++++++++++++++++++ .../subway/controller/MainController.java | 19 ++++++++ .../subway/controller/MainViewController.java | 34 +++++++++++++ .../controller/SectionViewController.java | 38 +++++++++++++++ .../subway/controller/ViewController.java | 24 ++++++++++ src/main/java/subway/menu/MainMenu.java | 38 +++++++++++++++ src/main/java/subway/menu/SectionMenu.java | 39 +++++++++++++++ src/main/java/subway/view/MainView.java | 27 +++++++++++ src/main/java/subway/view/SectionView.java | 27 +++++++++++ src/main/java/subway/view/View.java | 34 +++++++++++++ 13 files changed, 349 insertions(+), 2 deletions(-) create mode 100644 src/main/java/subway/Error.java create mode 100644 src/main/java/subway/Scene.java create mode 100644 src/main/java/subway/controller/MainController.java create mode 100644 src/main/java/subway/controller/MainViewController.java create mode 100644 src/main/java/subway/controller/SectionViewController.java create mode 100644 src/main/java/subway/controller/ViewController.java create mode 100644 src/main/java/subway/menu/MainMenu.java create mode 100644 src/main/java/subway/menu/SectionMenu.java create mode 100644 src/main/java/subway/view/MainView.java create mode 100644 src/main/java/subway/view/SectionView.java create mode 100644 src/main/java/subway/view/View.java diff --git a/README.md b/README.md index 1269c4be5..4feb761dd 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@
## ✅ 구현할 기능 목록 -- [ ] 지하철 노선도 경로 조회 인터페이스 +- [x] 지하철 노선도 경로 조회 인터페이스 - [입출력 요구사항](#-입출력-요구사항)의 양식에 맞추어 출력을 한다. - 존재하지 않는 기능의 입력이면 에러를 출력한다. - [ ] 구간 모델 구현 diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..c1ac8e2e8 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,14 @@ package subway; +import java.io.PrintStream; import java.util.Scanner; +import subway.controller.MainController; public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); - // TODO: 프로그램 구현 + final PrintStream printStream = new PrintStream(System.out); + final MainController mainController = new MainController(scanner, printStream); + mainController.run(); } } diff --git a/src/main/java/subway/Error.java b/src/main/java/subway/Error.java new file mode 100644 index 000000000..7ff0b1310 --- /dev/null +++ b/src/main/java/subway/Error.java @@ -0,0 +1,15 @@ +package subway; + +public enum Error { + INVALID_MENU("존재하지 않는 기능입니다."); + + private final String message; + + private Error(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/subway/Scene.java b/src/main/java/subway/Scene.java new file mode 100644 index 000000000..3eeecfac4 --- /dev/null +++ b/src/main/java/subway/Scene.java @@ -0,0 +1,48 @@ +package subway; + +import java.io.PrintStream; +import java.util.Scanner; +import java.util.Stack; +import subway.controller.MainViewController; +import subway.controller.ViewController; + +public class Scene { + private final Scanner scanner; + private final PrintStream printStream; + private final Stack controllers = new Stack(); + + public Scene(Scanner scanner, PrintStream printStream) { + this.scanner = scanner; + this.printStream = printStream; + controllers.add(new MainViewController(scanner, printStream)); + } + + public void runCurrentView() { + ViewController viewController = controllers.peek(); + viewController.run(this); + } + + public void goView(ViewController controller) { + controllers.push(controller); + } + + public void back() { + controllers.pop(); + } + + public void exit() { + controllers.clear(); + } + + public boolean isExit() { + return controllers.empty(); + } + + public Scanner getScanner() { + return scanner; + } + + public PrintStream getPrinstream() { + return printStream; + } +} diff --git a/src/main/java/subway/controller/MainController.java b/src/main/java/subway/controller/MainController.java new file mode 100644 index 000000000..f75a62834 --- /dev/null +++ b/src/main/java/subway/controller/MainController.java @@ -0,0 +1,19 @@ +package subway.controller; + +import java.io.PrintStream; +import java.util.Scanner; +import subway.Scene; + +public class MainController { + Scene scene; + + public MainController(Scanner scanner, PrintStream printStream) { + scene = new Scene(scanner, printStream); + } + + public void run() { + while (!scene.isExit()) { + scene.runCurrentView(); + } + } +} diff --git a/src/main/java/subway/controller/MainViewController.java b/src/main/java/subway/controller/MainViewController.java new file mode 100644 index 000000000..a1880b86f --- /dev/null +++ b/src/main/java/subway/controller/MainViewController.java @@ -0,0 +1,34 @@ +package subway.controller; + +import java.io.PrintStream; +import java.util.Scanner; +import java.util.function.Consumer; +import subway.Error; +import subway.Scene; +import subway.menu.MainMenu; +import subway.view.MainView; + +public class MainViewController extends ViewController{ + + public MainViewController(Scanner scanner, PrintStream printStream) { + view = new MainView(scanner, printStream); + } + + @Override + public Consumer selectMenu() { + String input = view.requestMenu(); + Consumer result = MainMenu.getAction(input); + if (result == null) { + view.printError(Error.INVALID_MENU); + } + return result; + } + + public static void goSectionView(Scene scene) { + scene.goView(new SectionViewController(scene.getScanner(), scene.getPrinstream())); + } + + public static void exit(Scene scene) { + scene.exit(); + } +} diff --git a/src/main/java/subway/controller/SectionViewController.java b/src/main/java/subway/controller/SectionViewController.java new file mode 100644 index 000000000..d715cde45 --- /dev/null +++ b/src/main/java/subway/controller/SectionViewController.java @@ -0,0 +1,38 @@ +package subway.controller; + +import java.io.PrintStream; +import java.util.Scanner; +import java.util.function.Consumer; +import subway.Error; +import subway.Scene; +import subway.menu.SectionMenu; +import subway.view.SectionView; + +public class SectionViewController extends ViewController{ + + public SectionViewController(Scanner scanner, PrintStream printStream) { + view = new SectionView(scanner, printStream); + } + + @Override + public Consumer selectMenu() { + String input = view.requestMenu(); + Consumer result = SectionMenu.getAction(input); + if (result == null) { + view.printError(Error.INVALID_MENU); + } + return result; + } + + public static void findMinDistance(Scene scene) { + scene.back(); + } + + public static void findMinTime(Scene scene) { + scene.back(); + } + + public static void back(Scene scene) { + scene.back(); + } +} diff --git a/src/main/java/subway/controller/ViewController.java b/src/main/java/subway/controller/ViewController.java new file mode 100644 index 000000000..723f5ce5c --- /dev/null +++ b/src/main/java/subway/controller/ViewController.java @@ -0,0 +1,24 @@ +package subway.controller; + +import java.io.PrintStream; +import java.util.Scanner; +import java.util.Stack; +import java.util.function.Consumer; +import subway.Scene; +import subway.view.View; + +public abstract class ViewController { + View view; + + public ViewController() { + } + + abstract public Consumer selectMenu(); + + public void run (Scene scene) { + Consumer action = selectMenu(); + if (action != null) { + action.accept(scene); + } + } +} diff --git a/src/main/java/subway/menu/MainMenu.java b/src/main/java/subway/menu/MainMenu.java new file mode 100644 index 000000000..994c15fbd --- /dev/null +++ b/src/main/java/subway/menu/MainMenu.java @@ -0,0 +1,38 @@ +package subway.menu; + +import java.util.Arrays; +import java.util.function.Consumer; +import subway.Scene; +import subway.controller.MainViewController; + +public enum MainMenu { + GO_SECTION_VIEW("1", "경로 조회", MainViewController::goSectionView), + EXIT("Q", "종료", MainViewController::exit); + + private String key; + private String message; + private Consumer action; + + private MainMenu(String key, String message, Consumer action) { + this.key = key; + this.message = message; + this.action = action; + } + + public static Consumer getAction(String input) { + MainMenu selectedMenu = Arrays.asList(MainMenu.values()).stream() + .filter(menu -> input.equals(menu.key)).findFirst().orElse(null); + if (selectedMenu == null) { + return null; + } + return selectedMenu.action; + } + + public String getKey() { + return key; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/subway/menu/SectionMenu.java b/src/main/java/subway/menu/SectionMenu.java new file mode 100644 index 000000000..5b0bd6c41 --- /dev/null +++ b/src/main/java/subway/menu/SectionMenu.java @@ -0,0 +1,39 @@ +package subway.menu; + +import java.util.Arrays; +import java.util.function.Consumer; +import subway.Scene; +import subway.controller.SectionViewController; + +public enum SectionMenu { + MIN_DISTANCE("1", "최단 거리", SectionViewController::findMinDistance), + MIN_TIME("2", "최소 시간", SectionViewController::findMinTime), + BACK("B", "돌아가기", SectionViewController::back); + + private String key; + private String message; + private Consumer action; + + private SectionMenu(String key, String message, Consumer action) { + this.key = key; + this.message = message; + this.action = action; + } + + public static Consumer getAction(String input) { + SectionMenu selectedMenu = Arrays.asList(SectionMenu.values()).stream() + .filter(menu -> input.equals(menu.key)).findFirst().orElse(null); + if (selectedMenu == null) { + return null; + } + return selectedMenu.action; + } + + public String getKey() { + return key; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/subway/view/MainView.java b/src/main/java/subway/view/MainView.java new file mode 100644 index 000000000..26815847d --- /dev/null +++ b/src/main/java/subway/view/MainView.java @@ -0,0 +1,27 @@ +package subway.view; + +import java.io.PrintStream; +import java.util.Arrays; +import java.util.Scanner; +import subway.menu.MainMenu; + +public class MainView extends View { + private static final String TITLE = "메인 화면"; + + public MainView(Scanner scanner, PrintStream printStream) { + super(scanner, printStream); + } + + @Override + void printTitle() { + printStream.printf(TITLE_FORM, TITLE); + } + + @Override + void printMenuList() { + Arrays.asList(MainMenu.values()).stream() + .forEach(menu -> printStream.printf(MENU_FORM, menu.getKey(), menu.getMessage())); + printStream.println(); + } + +} diff --git a/src/main/java/subway/view/SectionView.java b/src/main/java/subway/view/SectionView.java new file mode 100644 index 000000000..572d44e89 --- /dev/null +++ b/src/main/java/subway/view/SectionView.java @@ -0,0 +1,27 @@ +package subway.view; + +import java.io.PrintStream; +import java.util.Arrays; +import java.util.Scanner; +import subway.menu.MainMenu; +import subway.menu.SectionMenu; + +public class SectionView extends View { + private static final String TITLE = "경로 기준"; + + public SectionView(Scanner scanner, PrintStream printStream) { + super(scanner, printStream); + } + + @Override + void printTitle() { + printStream.printf(TITLE_FORM, TITLE); + } + + @Override + void printMenuList() { + Arrays.asList(SectionMenu.values()).stream() + .forEach(menu -> printStream.printf(MENU_FORM, menu.getKey(), menu.getMessage())); + printStream.println(); + } +} diff --git a/src/main/java/subway/view/View.java b/src/main/java/subway/view/View.java new file mode 100644 index 000000000..783146ee0 --- /dev/null +++ b/src/main/java/subway/view/View.java @@ -0,0 +1,34 @@ +package subway.view; + +import java.io.PrintStream; +import java.util.Scanner; +import subway.Error; + +public abstract class View { + private static final String ERROR_FORM = "[ERROR] %s\n"; + protected static final String TITLE_FORM = "## %s\n"; + protected static final String MENU_FORM = "%s. %s\n"; + protected final Scanner scanner; + protected final PrintStream printStream; + + protected View(Scanner scanner, PrintStream printStream) { + this.scanner = scanner; + this.printStream = printStream; + } + + abstract void printTitle(); + abstract void printMenuList(); + + public String requestMenu() { + printTitle(); + printMenuList(); + String input = scanner.nextLine(); + printStream.println(); + return input; + } + + public void printError(Error error) { + printStream.printf(ERROR_FORM, error.getMessage()); + printStream.println(); + } +} From 76503bb68c8988c94873f5ae36281f5247fccc83 Mon Sep 17 00:00:00 2001 From: Junroot Date: Sat, 19 Dec 2020 15:36:13 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat(subway):=20=EA=B5=AC=EA=B0=84=20?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Line에 stations, distances, times 정보 추가 --- README.md | 2 +- src/main/java/subway/domain/Line.java | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4feb761dd..5d3b0b917 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ - [x] 지하철 노선도 경로 조회 인터페이스 - [입출력 요구사항](#-입출력-요구사항)의 양식에 맞추어 출력을 한다. - 존재하지 않는 기능의 입력이면 에러를 출력한다. -- [ ] 구간 모델 구현 +- [x] 구간 모델 구현 - 구간에는 노선의 이름, 역 사이의 거리와 시간이 필요하다. - [ ] 구간 Repository 구현 - 모든 구간들을 관리할 수 있는 Repository를 구현한다. diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..fa5495440 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,7 +1,13 @@ package subway.domain; +import java.util.ArrayList; +import java.util.List; + public class Line { private String name; + private List stations = new ArrayList(); + private List distances = new ArrayList(); // 0번째와 1번째 station들의 관계는 0번째 인덱스에 존재한다. + private List times = new ArrayList(); public Line(String name) { this.name = name; @@ -11,5 +17,9 @@ public String getName() { return name; } - // 추가 기능 구현 + public void pushSections(Station station, int distance, int time) { + stations.add(station); + distances.add(distance); + times.add(time); + } } From 5af46f77b7405a3fee0ff7411914e759f7cfcd76 Mon Sep 17 00:00:00 2001 From: Junroot Date: Sat, 19 Dec 2020 16:18:09 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat(subway):=20=EC=B4=88=EA=B8=B0=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit InitialSetup 클래스 추가 --- README.md | 2 +- src/main/java/subway/Application.java | 1 + src/main/java/subway/InitialSetup.java | 66 +++++++++++++++++++ .../subway/controller/ViewController.java | 3 - src/main/java/subway/domain/Line.java | 6 ++ .../java/subway/domain/StationRepository.java | 5 ++ src/main/java/subway/view/SectionView.java | 1 - 7 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/main/java/subway/InitialSetup.java diff --git a/README.md b/README.md index 5d3b0b917..81ba5e18a 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ - 구간에는 노선의 이름, 역 사이의 거리와 시간이 필요하다. - [ ] 구간 Repository 구현 - 모든 구간들을 관리할 수 있는 Repository를 구현한다. -- [ ] 초기 설정 구현 +- [x] 초기 설정 구현 - [기능 요구사항](#-기능-요구사항)에따라 초기 설정을 하도록 구현한다. - [ ] 최단 경로 기능의 입력 구현 - 존재하지 않은 역의 입력인 경우 예외 처리 diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index c1ac8e2e8..ed1178f04 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -8,6 +8,7 @@ public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); final PrintStream printStream = new PrintStream(System.out); + InitialSetup.apply(); final MainController mainController = new MainController(scanner, printStream); mainController.run(); } diff --git a/src/main/java/subway/InitialSetup.java b/src/main/java/subway/InitialSetup.java new file mode 100644 index 000000000..17d0b8110 --- /dev/null +++ b/src/main/java/subway/InitialSetup.java @@ -0,0 +1,66 @@ +package subway; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; + +public class InitialSetup { + private static final String[] STATIONS = + {"교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"}; + private static final LinkedHashMap> STATIONS_OF_LINE = + new LinkedHashMap>(); + private static final LinkedHashMap> DISTANCES_OF_LINE = + new LinkedHashMap>(); + private static final LinkedHashMap> TIMES_OF_LINE = + new LinkedHashMap>(); + + static { + STATIONS_OF_LINE.put("2호선", Arrays.asList("교대역", "강남역", "역삼역")); + STATIONS_OF_LINE.put("3호선", Arrays.asList("교대역", "남부터미널역", "양재역", "매봉역")); + STATIONS_OF_LINE.put("신분당선", Arrays.asList("강남역", "양재역", "양재시민의숲역")); + + DISTANCES_OF_LINE.put("2호선", Arrays.asList(2, 2)); + DISTANCES_OF_LINE.put("3호선", Arrays.asList(3, 6, 1)); + DISTANCES_OF_LINE.put("신분당선", Arrays.asList(2, 10)); + + TIMES_OF_LINE.put("2호선", Arrays.asList(3, 3)); + TIMES_OF_LINE.put("3호선", Arrays.asList(2, 5, 1)); + TIMES_OF_LINE.put("신분당선", Arrays.asList(8, 3)); + } + + public static void apply() { + applyStations(); + applyLines(); + } + + private static void applyStations() { + for (String stationName : STATIONS) { + StationRepository.addStation(new Station(stationName)); + } + } + + private static void applyLines() { + for (String lineName : STATIONS_OF_LINE.keySet()) { + Line currentLine = new Line(lineName); + LineRepository.addLine(currentLine); + applyStationsOfLine(currentLine, STATIONS_OF_LINE.get(lineName)); + } + } + + private static void applyStationsOfLine(Line line, List stationNames) { + List distances = DISTANCES_OF_LINE.get(line.getName()); + List times = TIMES_OF_LINE.get(line.getName()); + for (int index = 0; index < stationNames.size(); index++) { + Station currentStation = StationRepository.getStationbyName(stationNames.get(index)); + if (index == 0) { + line.registerFirstStation(currentStation); + continue; + } + line.pushSections(currentStation, distances.get(index - 1), times.get(index - 1)); + } + } +} diff --git a/src/main/java/subway/controller/ViewController.java b/src/main/java/subway/controller/ViewController.java index 723f5ce5c..da6a7895f 100644 --- a/src/main/java/subway/controller/ViewController.java +++ b/src/main/java/subway/controller/ViewController.java @@ -1,8 +1,5 @@ package subway.controller; -import java.io.PrintStream; -import java.util.Scanner; -import java.util.Stack; import java.util.function.Consumer; import subway.Scene; import subway.view.View; diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index fa5495440..45f906b6d 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -16,6 +16,12 @@ public Line(String name) { public String getName() { return name; } + + public void registerFirstStation(Station station) { + if (stations.isEmpty()) { + stations.add(station); + } + } public void pushSections(Station station, int distance, int time) { stations.add(station); diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index 8ed9d103f..19e3f2563 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -23,4 +23,9 @@ public static boolean deleteStation(String name) { public static void deleteAll() { stations.clear(); } + + public static Station getStationbyName(String name) { + return stations.stream().filter(station -> name.equals(station.getName())).findFirst() + .orElse(null); + } } diff --git a/src/main/java/subway/view/SectionView.java b/src/main/java/subway/view/SectionView.java index 572d44e89..7afa83835 100644 --- a/src/main/java/subway/view/SectionView.java +++ b/src/main/java/subway/view/SectionView.java @@ -3,7 +3,6 @@ import java.io.PrintStream; import java.util.Arrays; import java.util.Scanner; -import subway.menu.MainMenu; import subway.menu.SectionMenu; public class SectionView extends View { From 5fd0c02f25a5360d266ed4e2c4b8ec5c4c83e3c7 Mon Sep 17 00:00:00 2001 From: Junroot Date: Sat, 19 Dec 2020 16:48:26 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat(subway):=20=EC=B5=9C=EB=8B=A8=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EA=B8=B0=EB=8A=A5=EC=9D=98=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=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/Error.java | 5 ++- .../subway/controller/MainViewController.java | 11 ++--- .../controller/SectionViewController.java | 45 ++++++++++++++++--- .../subway/controller/ViewController.java | 10 ++--- src/main/java/subway/menu/MainMenu.java | 9 ++-- src/main/java/subway/menu/SectionMenu.java | 9 ++-- src/main/java/subway/view/View.java | 18 ++++++++ 8 files changed, 83 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 81ba5e18a..454c568fb 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ - 모든 구간들을 관리할 수 있는 Repository를 구현한다. - [x] 초기 설정 구현 - [기능 요구사항](#-기능-요구사항)에따라 초기 설정을 하도록 구현한다. -- [ ] 최단 경로 기능의 입력 구현 +- [x] 최단 경로 기능의 입력 구현 - 존재하지 않은 역의 입력인 경우 예외 처리 - 출발역과 도착역이 같은 경우 예외 처리 - [ ] 최단 경로 기능 구현 diff --git a/src/main/java/subway/Error.java b/src/main/java/subway/Error.java index 7ff0b1310..2346f29e6 100644 --- a/src/main/java/subway/Error.java +++ b/src/main/java/subway/Error.java @@ -1,7 +1,10 @@ package subway; public enum Error { - INVALID_MENU("존재하지 않는 기능입니다."); + OK("오류 없음"), + INVALID_MENU("존재하지 않는 기능입니다."), + SAME_STATIONS("출발역과 도착역이 동일합니다."), + STATION_NOT_EXISTS("존재하지 않는 역입니다."); private final String message; diff --git a/src/main/java/subway/controller/MainViewController.java b/src/main/java/subway/controller/MainViewController.java index a1880b86f..6ef5b8f3d 100644 --- a/src/main/java/subway/controller/MainViewController.java +++ b/src/main/java/subway/controller/MainViewController.java @@ -2,11 +2,12 @@ import java.io.PrintStream; import java.util.Scanner; -import java.util.function.Consumer; +import java.util.function.BiConsumer; import subway.Error; import subway.Scene; import subway.menu.MainMenu; import subway.view.MainView; +import subway.view.View; public class MainViewController extends ViewController{ @@ -15,20 +16,20 @@ public MainViewController(Scanner scanner, PrintStream printStream) { } @Override - public Consumer selectMenu() { + public BiConsumer selectMenu() { String input = view.requestMenu(); - Consumer result = MainMenu.getAction(input); + BiConsumer result = MainMenu.getAction(input); if (result == null) { view.printError(Error.INVALID_MENU); } return result; } - public static void goSectionView(Scene scene) { + public static void goSectionView(Scene scene, View view) { scene.goView(new SectionViewController(scene.getScanner(), scene.getPrinstream())); } - public static void exit(Scene scene) { + public static void exit(Scene scene, View view) { scene.exit(); } } diff --git a/src/main/java/subway/controller/SectionViewController.java b/src/main/java/subway/controller/SectionViewController.java index d715cde45..9beb3db33 100644 --- a/src/main/java/subway/controller/SectionViewController.java +++ b/src/main/java/subway/controller/SectionViewController.java @@ -2,11 +2,14 @@ import java.io.PrintStream; import java.util.Scanner; -import java.util.function.Consumer; +import java.util.function.BiConsumer; import subway.Error; import subway.Scene; +import subway.domain.Station; +import subway.domain.StationRepository; import subway.menu.SectionMenu; import subway.view.SectionView; +import subway.view.View; public class SectionViewController extends ViewController{ @@ -15,24 +18,54 @@ public SectionViewController(Scanner scanner, PrintStream printStream) { } @Override - public Consumer selectMenu() { + public BiConsumer selectMenu() { String input = view.requestMenu(); - Consumer result = SectionMenu.getAction(input); + BiConsumer result = SectionMenu.getAction(input); if (result == null) { view.printError(Error.INVALID_MENU); } return result; } - public static void findMinDistance(Scene scene) { + public static void findMinDistance(Scene scene, View view) { + String departureInput = view.requestDepartureStation(); + String arrivalInput = view.requestArrivalStation(); + Error error = isValidStations(departureInput, arrivalInput); + if (error != Error.OK) { + view.printError(error); + return; + } + Station departureStation = StationRepository.getStationbyName(departureInput); + Station arrivalStation = StationRepository.getStationbyName(arrivalInput); scene.back(); } - public static void findMinTime(Scene scene) { + public static void findMinTime(Scene scene, View view) { + String departureInput = view.requestDepartureStation(); + String arrivalInput = view.requestArrivalStation(); + Error error = isValidStations(departureInput, arrivalInput); + if (error != Error.OK) { + view.printError(error); + return; + } + Station departureStation = StationRepository.getStationbyName(departureInput); + Station arrivalStation = StationRepository.getStationbyName(arrivalInput); scene.back(); } - public static void back(Scene scene) { + private static Error isValidStations(String departureInput, String arrivalInput) { + if (departureInput.equals(arrivalInput)) { + return Error.SAME_STATIONS; + } + Station departureStation = StationRepository.getStationbyName(departureInput); + Station arrivalStation = StationRepository.getStationbyName(arrivalInput); + if ((departureStation == null) || (arrivalStation == null)) { + return Error.STATION_NOT_EXISTS; + } + return Error.OK; + } + + public static void back(Scene scene, View view) { scene.back(); } } diff --git a/src/main/java/subway/controller/ViewController.java b/src/main/java/subway/controller/ViewController.java index da6a7895f..169e1df83 100644 --- a/src/main/java/subway/controller/ViewController.java +++ b/src/main/java/subway/controller/ViewController.java @@ -1,21 +1,21 @@ package subway.controller; -import java.util.function.Consumer; +import java.util.function.BiConsumer; import subway.Scene; import subway.view.View; public abstract class ViewController { - View view; + protected View view; public ViewController() { } - abstract public Consumer selectMenu(); + abstract public BiConsumer selectMenu(); public void run (Scene scene) { - Consumer action = selectMenu(); + BiConsumer action = selectMenu(); if (action != null) { - action.accept(scene); + action.accept(scene, view);; } } } diff --git a/src/main/java/subway/menu/MainMenu.java b/src/main/java/subway/menu/MainMenu.java index 994c15fbd..874ccb2b2 100644 --- a/src/main/java/subway/menu/MainMenu.java +++ b/src/main/java/subway/menu/MainMenu.java @@ -1,9 +1,10 @@ package subway.menu; import java.util.Arrays; -import java.util.function.Consumer; +import java.util.function.BiConsumer; import subway.Scene; import subway.controller.MainViewController; +import subway.view.View; public enum MainMenu { GO_SECTION_VIEW("1", "경로 조회", MainViewController::goSectionView), @@ -11,15 +12,15 @@ public enum MainMenu { private String key; private String message; - private Consumer action; + private BiConsumer action; - private MainMenu(String key, String message, Consumer action) { + private MainMenu(String key, String message, BiConsumer action) { this.key = key; this.message = message; this.action = action; } - public static Consumer getAction(String input) { + public static BiConsumer getAction(String input) { MainMenu selectedMenu = Arrays.asList(MainMenu.values()).stream() .filter(menu -> input.equals(menu.key)).findFirst().orElse(null); if (selectedMenu == null) { diff --git a/src/main/java/subway/menu/SectionMenu.java b/src/main/java/subway/menu/SectionMenu.java index 5b0bd6c41..c83a353a0 100644 --- a/src/main/java/subway/menu/SectionMenu.java +++ b/src/main/java/subway/menu/SectionMenu.java @@ -1,9 +1,10 @@ package subway.menu; import java.util.Arrays; -import java.util.function.Consumer; +import java.util.function.BiConsumer; import subway.Scene; import subway.controller.SectionViewController; +import subway.view.View; public enum SectionMenu { MIN_DISTANCE("1", "최단 거리", SectionViewController::findMinDistance), @@ -12,15 +13,15 @@ public enum SectionMenu { private String key; private String message; - private Consumer action; + private BiConsumer action; - private SectionMenu(String key, String message, Consumer action) { + private SectionMenu(String key, String message, BiConsumer action) { this.key = key; this.message = message; this.action = action; } - public static Consumer getAction(String input) { + public static BiConsumer getAction(String input) { SectionMenu selectedMenu = Arrays.asList(SectionMenu.values()).stream() .filter(menu -> input.equals(menu.key)).findFirst().orElse(null); if (selectedMenu == null) { diff --git a/src/main/java/subway/view/View.java b/src/main/java/subway/view/View.java index 783146ee0..8330f13b8 100644 --- a/src/main/java/subway/view/View.java +++ b/src/main/java/subway/view/View.java @@ -5,6 +5,9 @@ import subway.Error; public abstract class View { + private static final String DEPARTURE_STATION_MESSAGE = "출발역을 입력하세요."; + private static final String ARRIVAL_STATION_MESSAGE = "출발역을 입력하세요."; + private static final String MENU_SELECTION_MESSAGE = "원하는 기능을 선택하세요."; private static final String ERROR_FORM = "[ERROR] %s\n"; protected static final String TITLE_FORM = "## %s\n"; protected static final String MENU_FORM = "%s. %s\n"; @@ -19,9 +22,24 @@ protected View(Scanner scanner, PrintStream printStream) { abstract void printTitle(); abstract void printMenuList(); + public String requestDepartureStation() { + printStream.printf(TITLE_FORM, DEPARTURE_STATION_MESSAGE); + String input = scanner.nextLine(); + printStream.println(); + return input; + } + + public String requestArrivalStation() { + printStream.printf(TITLE_FORM, ARRIVAL_STATION_MESSAGE); + String input = scanner.nextLine(); + printStream.println(); + return input; + } + public String requestMenu() { printTitle(); printMenuList(); + printStream.printf(TITLE_FORM, MENU_SELECTION_MESSAGE); String input = scanner.nextLine(); printStream.println(); return input; From 8e6470537080592b57af501c346c63b74879983b Mon Sep 17 00:00:00 2001 From: Junroot Date: Sat, 19 Dec 2020 17:45:07 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat(subway):=20=EC=B5=9C=EB=8B=A8=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=B0=BE=EA=B8=B0=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 --- src/main/java/subway/Error.java | 9 +- src/main/java/subway/InitialSetup.java | 14 +-- src/main/java/subway/Scene.java | 16 ++-- .../subway/controller/MainController.java | 4 +- .../subway/controller/MainViewController.java | 8 +- .../controller/SectionViewController.java | 44 +++++++-- .../subway/controller/ViewController.java | 11 +-- src/main/java/subway/domain/Line.java | 18 +++- src/main/java/subway/domain/PathFinder.java | 91 +++++++++++++++++++ src/main/java/subway/menu/SectionMenu.java | 6 +- src/main/java/subway/view/View.java | 31 +++++-- 11 files changed, 203 insertions(+), 49 deletions(-) create mode 100644 src/main/java/subway/domain/PathFinder.java diff --git a/src/main/java/subway/Error.java b/src/main/java/subway/Error.java index 2346f29e6..b9b8dba71 100644 --- a/src/main/java/subway/Error.java +++ b/src/main/java/subway/Error.java @@ -4,14 +4,15 @@ public enum Error { OK("오류 없음"), INVALID_MENU("존재하지 않는 기능입니다."), SAME_STATIONS("출발역과 도착역이 동일합니다."), - STATION_NOT_EXISTS("존재하지 않는 역입니다."); - + STATION_NOT_EXISTS("존재하지 않는 역입니다."), + STATION_NOT_CONNECTED("역이 연결되어 있지 않습니다."); + private final String message; - + private Error(String message) { this.message = message; } - + public String getMessage() { return message; } diff --git a/src/main/java/subway/InitialSetup.java b/src/main/java/subway/InitialSetup.java index 17d0b8110..372892fd5 100644 --- a/src/main/java/subway/InitialSetup.java +++ b/src/main/java/subway/InitialSetup.java @@ -10,7 +10,7 @@ public class InitialSetup { private static final String[] STATIONS = - {"교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"}; + {"교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"}; private static final LinkedHashMap> STATIONS_OF_LINE = new LinkedHashMap>(); private static final LinkedHashMap> DISTANCES_OF_LINE = @@ -22,27 +22,27 @@ public class InitialSetup { STATIONS_OF_LINE.put("2호선", Arrays.asList("교대역", "강남역", "역삼역")); STATIONS_OF_LINE.put("3호선", Arrays.asList("교대역", "남부터미널역", "양재역", "매봉역")); STATIONS_OF_LINE.put("신분당선", Arrays.asList("강남역", "양재역", "양재시민의숲역")); - + DISTANCES_OF_LINE.put("2호선", Arrays.asList(2, 2)); DISTANCES_OF_LINE.put("3호선", Arrays.asList(3, 6, 1)); DISTANCES_OF_LINE.put("신분당선", Arrays.asList(2, 10)); - + TIMES_OF_LINE.put("2호선", Arrays.asList(3, 3)); TIMES_OF_LINE.put("3호선", Arrays.asList(2, 5, 1)); TIMES_OF_LINE.put("신분당선", Arrays.asList(8, 3)); } - + public static void apply() { applyStations(); applyLines(); } - + private static void applyStations() { for (String stationName : STATIONS) { StationRepository.addStation(new Station(stationName)); } } - + private static void applyLines() { for (String lineName : STATIONS_OF_LINE.keySet()) { Line currentLine = new Line(lineName); @@ -50,7 +50,7 @@ private static void applyLines() { applyStationsOfLine(currentLine, STATIONS_OF_LINE.get(lineName)); } } - + private static void applyStationsOfLine(Line line, List stationNames) { List distances = DISTANCES_OF_LINE.get(line.getName()); List times = TIMES_OF_LINE.get(line.getName()); diff --git a/src/main/java/subway/Scene.java b/src/main/java/subway/Scene.java index 3eeecfac4..eb385c372 100644 --- a/src/main/java/subway/Scene.java +++ b/src/main/java/subway/Scene.java @@ -10,38 +10,38 @@ public class Scene { private final Scanner scanner; private final PrintStream printStream; private final Stack controllers = new Stack(); - + public Scene(Scanner scanner, PrintStream printStream) { this.scanner = scanner; this.printStream = printStream; controllers.add(new MainViewController(scanner, printStream)); } - + public void runCurrentView() { ViewController viewController = controllers.peek(); viewController.run(this); } - + public void goView(ViewController controller) { controllers.push(controller); } - + public void back() { controllers.pop(); } - + public void exit() { controllers.clear(); } - + public boolean isExit() { return controllers.empty(); } - + public Scanner getScanner() { return scanner; } - + public PrintStream getPrinstream() { return printStream; } diff --git a/src/main/java/subway/controller/MainController.java b/src/main/java/subway/controller/MainController.java index f75a62834..2619f6481 100644 --- a/src/main/java/subway/controller/MainController.java +++ b/src/main/java/subway/controller/MainController.java @@ -6,11 +6,11 @@ public class MainController { Scene scene; - + public MainController(Scanner scanner, PrintStream printStream) { scene = new Scene(scanner, printStream); } - + public void run() { while (!scene.isExit()) { scene.runCurrentView(); diff --git a/src/main/java/subway/controller/MainViewController.java b/src/main/java/subway/controller/MainViewController.java index 6ef5b8f3d..7b1ae0cfa 100644 --- a/src/main/java/subway/controller/MainViewController.java +++ b/src/main/java/subway/controller/MainViewController.java @@ -9,8 +9,8 @@ import subway.view.MainView; import subway.view.View; -public class MainViewController extends ViewController{ - +public class MainViewController extends ViewController { + public MainViewController(Scanner scanner, PrintStream printStream) { view = new MainView(scanner, printStream); } @@ -24,11 +24,11 @@ public BiConsumer selectMenu() { } return result; } - + public static void goSectionView(Scene scene, View view) { scene.goView(new SectionViewController(scene.getScanner(), scene.getPrinstream())); } - + public static void exit(Scene scene, View view) { scene.exit(); } diff --git a/src/main/java/subway/controller/SectionViewController.java b/src/main/java/subway/controller/SectionViewController.java index 9beb3db33..1b4b3bf73 100644 --- a/src/main/java/subway/controller/SectionViewController.java +++ b/src/main/java/subway/controller/SectionViewController.java @@ -1,17 +1,19 @@ package subway.controller; import java.io.PrintStream; +import java.util.List; import java.util.Scanner; import java.util.function.BiConsumer; import subway.Error; import subway.Scene; +import subway.domain.PathFinder; import subway.domain.Station; import subway.domain.StationRepository; import subway.menu.SectionMenu; import subway.view.SectionView; import subway.view.View; -public class SectionViewController extends ViewController{ +public class SectionViewController extends ViewController { public SectionViewController(Scanner scanner, PrintStream printStream) { view = new SectionView(scanner, printStream); @@ -26,7 +28,7 @@ public BiConsumer selectMenu() { } return result; } - + public static void findMinDistance(Scene scene, View view) { String departureInput = view.requestDepartureStation(); String arrivalInput = view.requestArrivalStation(); @@ -35,11 +37,25 @@ public static void findMinDistance(Scene scene, View view) { view.printError(error); return; } + List path = findMinDistancePath(departureInput, arrivalInput, view); + if (path == null) { + return; + } + view.printPath(path); + scene.back(); + } + + private static List findMinDistancePath(String departureInput, String arrivalInput, + View view) { Station departureStation = StationRepository.getStationbyName(departureInput); Station arrivalStation = StationRepository.getStationbyName(arrivalInput); - scene.back(); + List path = PathFinder.findMinDistancePath(departureStation, arrivalStation); + if (path == null) { + view.printError(Error.STATION_NOT_CONNECTED); + } + return path; } - + public static void findMinTime(Scene scene, View view) { String departureInput = view.requestDepartureStation(); String arrivalInput = view.requestArrivalStation(); @@ -48,11 +64,25 @@ public static void findMinTime(Scene scene, View view) { view.printError(error); return; } + List path = findMinTimePath(departureInput, arrivalInput, view); + if (path == null) { + return; + } + view.printPath(path); + scene.back(); + } + + private static List findMinTimePath(String departureInput, String arrivalInput, + View view) { Station departureStation = StationRepository.getStationbyName(departureInput); Station arrivalStation = StationRepository.getStationbyName(arrivalInput); - scene.back(); + List path = PathFinder.findMinTimePath(departureStation, arrivalStation); + if (path == null) { + view.printError(Error.STATION_NOT_CONNECTED); + } + return path; } - + private static Error isValidStations(String departureInput, String arrivalInput) { if (departureInput.equals(arrivalInput)) { return Error.SAME_STATIONS; @@ -64,7 +94,7 @@ private static Error isValidStations(String departureInput, String arrivalInput) } return Error.OK; } - + public static void back(Scene scene, View view) { scene.back(); } diff --git a/src/main/java/subway/controller/ViewController.java b/src/main/java/subway/controller/ViewController.java index 169e1df83..6bd90aba1 100644 --- a/src/main/java/subway/controller/ViewController.java +++ b/src/main/java/subway/controller/ViewController.java @@ -6,13 +6,12 @@ public abstract class ViewController { protected View view; - - public ViewController() { - } - + + public ViewController() {} + abstract public BiConsumer selectMenu(); - - public void run (Scene scene) { + + public void run(Scene scene) { BiConsumer action = selectMenu(); if (action != null) { action.accept(scene, view);; diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 45f906b6d..e8e391ca4 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,12 +1,14 @@ package subway.domain; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class Line { private String name; private List stations = new ArrayList(); - private List distances = new ArrayList(); // 0번째와 1번째 station들의 관계는 0번째 인덱스에 존재한다. + private List distances = new ArrayList(); // 0번째와 1번째 station들의 관계는 0번째 인덱스에 + // 존재한다. private List times = new ArrayList(); public Line(String name) { @@ -16,7 +18,19 @@ public Line(String name) { public String getName() { return name; } - + + public List getStations() { + return Collections.unmodifiableList(stations); + } + + public List getDistances() { + return Collections.unmodifiableList(distances); + } + + public List getTimes() { + return Collections.unmodifiableList(times); + } + public void registerFirstStation(Station station) { if (stations.isEmpty()) { stations.add(station); diff --git a/src/main/java/subway/domain/PathFinder.java b/src/main/java/subway/domain/PathFinder.java new file mode 100644 index 000000000..2fefe2205 --- /dev/null +++ b/src/main/java/subway/domain/PathFinder.java @@ -0,0 +1,91 @@ +package subway.domain; + +import java.util.List; +import java.util.stream.Collectors; +import org.jgrapht.GraphPath; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; + +public class PathFinder { + + public static List findMinDistancePath(Station departure, Station arrival) { + WeightedMultigraph graph = initializeGraphForDistance(); + DijkstraShortestPath dijkstraShortesPath = + new DijkstraShortestPath(graph); + GraphPath path = + dijkstraShortesPath.getPath(departure.getName(), arrival.getName()); + if (path == null) { + return null; + } + return path.getVertexList(); + } + + public static List findMinTimePath(Station departure, Station arrival) { + WeightedMultigraph graph = initializeGraphForTime(); + DijkstraShortestPath dijkstraShortesPath = + new DijkstraShortestPath(graph); + GraphPath path = + dijkstraShortesPath.getPath(departure.getName(), arrival.getName()); + if (path == null) { + return null; + } + return path.getVertexList(); + } + + private static WeightedMultigraph initializeGraphForDistance() { + WeightedMultigraph graph = + new WeightedMultigraph(DefaultWeightedEdge.class); + List stationNames = StationRepository.stations().stream() + .map(station -> station.getName()).collect(Collectors.toList()); + List lines = LineRepository.lines(); + initializeStations(stationNames, graph); + initializeLinesForDistance(lines, graph); + return graph; + } + + private static WeightedMultigraph initializeGraphForTime() { + WeightedMultigraph graph = + new WeightedMultigraph(DefaultWeightedEdge.class); + List stationNames = StationRepository.stations().stream() + .map(station -> station.getName()).collect(Collectors.toList()); + List lines = LineRepository.lines(); + initializeStations(stationNames, graph); + initializeLinesForTime(lines, graph); + return graph; + } + + private static void initializeStations(List stationNames, + WeightedMultigraph graph) { + for (String stationName : stationNames) { + graph.addVertex(stationName); + } + } + + private static void initializeLinesForDistance(List lines, + WeightedMultigraph graph) { + for (Line line : lines) { + List stations = line.getStations(); + List distances = line.getDistances(); + for (int index = 0; index < distances.size(); index++) { + String firstStation = stations.get(index).getName(); + String secondStation = stations.get(index + 1).getName(); + graph.setEdgeWeight(graph.addEdge(firstStation, secondStation), + distances.get(index)); + } + } + } + + private static void initializeLinesForTime(List lines, + WeightedMultigraph graph) { + for (Line line : lines) { + List stations = line.getStations(); + List times = line.getTimes(); + for (int index = 0; index < times.size(); index++) { + String firstStation = stations.get(index).getName(); + String secondStation = stations.get(index + 1).getName(); + graph.setEdgeWeight(graph.addEdge(firstStation, secondStation), times.get(index)); + } + } + } +} diff --git a/src/main/java/subway/menu/SectionMenu.java b/src/main/java/subway/menu/SectionMenu.java index c83a353a0..359011c41 100644 --- a/src/main/java/subway/menu/SectionMenu.java +++ b/src/main/java/subway/menu/SectionMenu.java @@ -10,17 +10,17 @@ public enum SectionMenu { MIN_DISTANCE("1", "최단 거리", SectionViewController::findMinDistance), MIN_TIME("2", "최소 시간", SectionViewController::findMinTime), BACK("B", "돌아가기", SectionViewController::back); - + private String key; private String message; private BiConsumer action; - + private SectionMenu(String key, String message, BiConsumer action) { this.key = key; this.message = message; this.action = action; } - + public static BiConsumer getAction(String input) { SectionMenu selectedMenu = Arrays.asList(SectionMenu.values()).stream() .filter(menu -> input.equals(menu.key)).findFirst().orElse(null); diff --git a/src/main/java/subway/view/View.java b/src/main/java/subway/view/View.java index 8330f13b8..f0e7b2d00 100644 --- a/src/main/java/subway/view/View.java +++ b/src/main/java/subway/view/View.java @@ -1,6 +1,7 @@ package subway.view; import java.io.PrintStream; +import java.util.List; import java.util.Scanner; import subway.Error; @@ -8,34 +9,40 @@ public abstract class View { private static final String DEPARTURE_STATION_MESSAGE = "출발역을 입력하세요."; private static final String ARRIVAL_STATION_MESSAGE = "출발역을 입력하세요."; private static final String MENU_SELECTION_MESSAGE = "원하는 기능을 선택하세요."; + private static final String BORDER = "---\n"; + private static final String TOTAL_DISTANCE = "총 거리: "; + private static final String TOTAL_TIME = "총 소요 시간: "; + private static final String RESULT_TITLE = "조회 결과"; + private static final String INFO_FORM = "[INFO] %s\n"; private static final String ERROR_FORM = "[ERROR] %s\n"; protected static final String TITLE_FORM = "## %s\n"; protected static final String MENU_FORM = "%s. %s\n"; protected final Scanner scanner; protected final PrintStream printStream; - + protected View(Scanner scanner, PrintStream printStream) { this.scanner = scanner; this.printStream = printStream; } - + abstract void printTitle(); + abstract void printMenuList(); - + public String requestDepartureStation() { printStream.printf(TITLE_FORM, DEPARTURE_STATION_MESSAGE); String input = scanner.nextLine(); printStream.println(); return input; } - + public String requestArrivalStation() { printStream.printf(TITLE_FORM, ARRIVAL_STATION_MESSAGE); String input = scanner.nextLine(); printStream.println(); return input; } - + public String requestMenu() { printTitle(); printMenuList(); @@ -44,7 +51,19 @@ public String requestMenu() { printStream.println(); return input; } - + + public void printPath(List names) { + printStream.printf(TITLE_FORM, RESULT_TITLE); + printStream.print(BORDER); + printStream.printf(INFO_FORM, TOTAL_DISTANCE); + printStream.printf(INFO_FORM, TOTAL_TIME); + printStream.print(BORDER); + for (String name : names) { + printStream.printf(INFO_FORM, name); + } + printStream.println(); + } + public void printError(Error error) { printStream.printf(ERROR_FORM, error.getMessage()); printStream.println(); From 9d28357eb9573c65782c5a66e625769a7eac0e58 Mon Sep 17 00:00:00 2001 From: Junroot Date: Sat, 19 Dec 2020 17:46:04 +0900 Subject: [PATCH 7/7] =?UTF-8?q?docs(README):=20=ED=95=84=EC=9A=94=ED=95=9C?= =?UTF-8?q?=20=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 --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 454c568fb..87382a7c6 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,14 @@ - 존재하지 않는 기능의 입력이면 에러를 출력한다. - [x] 구간 모델 구현 - 구간에는 노선의 이름, 역 사이의 거리와 시간이 필요하다. -- [ ] 구간 Repository 구현 - - 모든 구간들을 관리할 수 있는 Repository를 구현한다. - [x] 초기 설정 구현 - [기능 요구사항](#-기능-요구사항)에따라 초기 설정을 하도록 구현한다. - [x] 최단 경로 기능의 입력 구현 - 존재하지 않은 역의 입력인 경우 예외 처리 - 출발역과 도착역이 같은 경우 예외 처리 -- [ ] 최단 경로 기능 구현 +- [x] 최단 경로 찾기 기능 구현 - 출발역과 도착역이 연결되어 있지 않으면 예외 처리 +- [ ] 총 이동거리 및 소요 시간 출력 ## 🚀 기능 요구사항