diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..ab5e6b537 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,32 @@ +## 기능목록 + + +### Domain +####역 + - 기본 셋팅 역 정보 저장 +####라인 + - 라인 별 역 저장 + - 라인 별 시간 저장 + - 라인 별 거리 저장 + - 기본 셋팅 라인 저장 + - 역 간 거리 계산 + - 특정 역이 라인에 존재하는지에 대한 여부 확인 + +### View + - InputView + - OutputView + +### Controller + - 메인화면 기능 선택 + - 최단 거리 경로 선택 + - 최소 시간 경로 선택 + - 조회 경로 출력 + - 경로 기준 화면 선택 + +### Exception + - 출발역과 도착역이 같으면 에러 처리 + - 출박역과 도착역이 이어지지 않았다면 에러 처리 + - 존재하지 않는 역 사용시 에러 처리 + - 기능 선택 시 입력 값이 메뉴 네임이 아닌경우 에러처리 + + \ No newline at end of file diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..9f65b0b8c 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,14 @@ package subway; +import subway.Controller.MainController; + import java.util.Scanner; public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); // TODO: 프로그램 구현 + new MainController(scanner); } + } diff --git a/src/main/java/subway/Controller/ComputeShortValue.java b/src/main/java/subway/Controller/ComputeShortValue.java new file mode 100644 index 000000000..d5fca81f3 --- /dev/null +++ b/src/main/java/subway/Controller/ComputeShortValue.java @@ -0,0 +1,83 @@ +package subway.Controller; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; + +import subway.View.OutputView; +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.Station; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ComputeShortValue { + private static List allLine=LineRepository.lines(); + List checkDuplicatedStation=new ArrayList(); + LineRepository lineRepository=new LineRepository(); + WeightedMultigraph distanceGraph = new WeightedMultigraph(DefaultWeightedEdge.class); + WeightedMultigraph timeGraph = new WeightedMultigraph(DefaultWeightedEdge.class); + + public void setDistanceGraph(String start,String end) { + + + setAllLine(distanceGraph); + setDistanceEdge(distanceGraph); + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(distanceGraph); + List shortestPath = dijkstraShortestPath.getPath(start, end).getVertexList(); + + OutputView outputView =new OutputView(); + outputView.printStation(shortestPath); + + } + public void setTimeGraph(String start,String end) { + setAllLine(timeGraph); + setTimeEdge(timeGraph); + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(distanceGraph); + List shortestPath = dijkstraShortestPath.getPath(start, end).getVertexList(); + + OutputView outputView =new OutputView(); + outputView.printStation(shortestPath); + } + public void setDistanceEdge(WeightedMultigraph tmpGraph) { + + for(int i=0;i tmpGraph) { + + for(int i=0;i tmpGraph) { + + for(int i=0;i tmpGraph) { + if(!checkDuplicatedStation.contains(tmpSaveStation.getName())){ + checkDuplicatedStation.add(tmpSaveStation.getName()); + + tmpGraph.addVertex(tmpSaveStation.getName()); + } + } + +} diff --git a/src/main/java/subway/Controller/MainController.java b/src/main/java/subway/Controller/MainController.java new file mode 100644 index 000000000..228204c0e --- /dev/null +++ b/src/main/java/subway/Controller/MainController.java @@ -0,0 +1,74 @@ +package subway.Controller; + + +import subway.View.InputView; +import subway.View.OutputView; +import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import subway.domain.Line; + +public class MainController { + private static final String MAIN_CONTROLLER_MENU_QUIT="Q"; + private static final String MAIN_CONTROLLER_PATH_SEARCH="1"; + private static final List STATION= Arrays.asList("교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"); + private static final List line=Arrays.asList("2호선","3호선","신분당선"); + Scanner scanner; + OutputView outputView=new OutputView(); + InputView inputView=new InputView(); + PathController pathController=new PathController(); + LineRepository lineRepository=new LineRepository(); + + public MainController(Scanner scanner){ + this.scanner=scanner; + initializeSubwayLine(); + initializeSubwayStation(); + initializeDistance(); + initializeTime(); + startMainMenu(scanner); + + } + public void startMainMenu(Scanner scanner) { + while(true) { + + outputView.setMainMenuMainDisplay(); + String tmpSaveMenuChoice = inputView.getChooseFunction(scanner); + if (tmpSaveMenuChoice.equals(MAIN_CONTROLLER_MENU_QUIT)) { + break; + } + if (tmpSaveMenuChoice.equals(MAIN_CONTROLLER_PATH_SEARCH)) { + pathController.startPathMenu(scanner); + continue; + } + } + } + public void initializeSubwayStation() { + for(int i=0;i time=Arrays.asList(3,2,5,1,8); + lineRepository.getLine(line.get(0)).setTime(Arrays.asList(time.get(0), time.get(0))); + lineRepository.getLine(line.get(1)).setTime(Arrays.asList(time.get(1), time.get(2),time.get(3))); + lineRepository.getLine(line.get(2)).setTime(Arrays.asList(time.get(4), time.get(0))); + + } + public void initializeDistance() { + List distance=Arrays.asList(2,3,6,10,1); + lineRepository.getLine(line.get(0)).setDistance(Arrays.asList(distance.get(0), distance.get(0))); + lineRepository.getLine(line.get(1)).setDistance(Arrays.asList(distance.get(1), distance.get(2),distance.get(4))); + lineRepository.getLine(line.get(2)).setDistance(Arrays.asList(distance.get(0), distance.get(3))); + } + +} diff --git a/src/main/java/subway/Controller/PathController.java b/src/main/java/subway/Controller/PathController.java new file mode 100644 index 000000000..8f929dc20 --- /dev/null +++ b/src/main/java/subway/Controller/PathController.java @@ -0,0 +1,40 @@ +package subway.Controller; + +import subway.View.InputView; +import subway.View.OutputView; + +import java.util.Scanner; + +public class PathController { + private static final String PATH_CONTROLLER_SHORT_DISTANCE="1"; + private static final String PATH_CONTROLLER_SHORT_TIME="2"; + private static final String PATH_CONTROLLER_BACK="B"; + + OutputView outputView=new OutputView(); + InputView inputView =new InputView(); + ComputeShortValue computeShortValue =new ComputeShortValue(); + + public void startPathMenu(Scanner scanner) { + outputView.setPathMenuPathStandard(); + String tmpSavePathMenuChoice = inputView.getChooseFunction(scanner); + pathMenuChoice(scanner,tmpSavePathMenuChoice); + } + public void pathMenuChoice(Scanner scanner,String tmpSavePathMenuChoice) { + if(tmpSavePathMenuChoice.equals(PATH_CONTROLLER_BACK)) { + return ; + } + if(tmpSavePathMenuChoice.equals(PATH_CONTROLLER_SHORT_TIME)) { + setPathControllerShortTime(scanner); + } + if(tmpSavePathMenuChoice.equals(PATH_CONTROLLER_SHORT_DISTANCE)) { + setPathControllerShortDistance(scanner); + } + } + public void setPathControllerShortDistance(Scanner scanner) { + computeShortValue.setDistanceGraph(inputView.getStationStart(scanner),inputView.getStationEnd(scanner)); + } + public void setPathControllerShortTime(Scanner scanner) { + computeShortValue.setTimeGraph(inputView.getStationEnd(scanner),inputView.getStationStart(scanner)); + } + +} diff --git a/src/main/java/subway/View/InputView.java b/src/main/java/subway/View/InputView.java new file mode 100644 index 000000000..6b047fbe8 --- /dev/null +++ b/src/main/java/subway/View/InputView.java @@ -0,0 +1,26 @@ +package subway.View; + +import java.util.Scanner; + +public class InputView { + + private static final String CHOOSE_FUNCTION_MAIN="## 원하는 기능을 선택하세요."; + private static final String STATION_START="## 출발역을 입력하세요."; + private static final String STATION_END="## 도착역을 입력하세요."; + + public String getStationStart(Scanner scanner){ + System.out.println(); + System.out.println(STATION_START); + return scanner.nextLine(); + } + public String getStationEnd(Scanner scanner){ + System.out.println(); + System.out.println(STATION_END); + return scanner.nextLine(); + } + public String getChooseFunction(Scanner scanner){ + System.out.println(); + System.out.println(CHOOSE_FUNCTION_MAIN); + return scanner.nextLine(); + } +} diff --git a/src/main/java/subway/View/OutputView.java b/src/main/java/subway/View/OutputView.java new file mode 100644 index 000000000..3db60e924 --- /dev/null +++ b/src/main/java/subway/View/OutputView.java @@ -0,0 +1,34 @@ +package subway.View; + +import java.util.List; + +public class OutputView { + private static final String MAIN_MENU_MAIN_DISPLAY="## 메인화면"; + private static final String MAIN_MENU_PATH_SEARCH="1. 경로 조회"; + private static final String MAIN_MENU_QUIT="Q. 종료"; + + private static final String PATH_MENU_PATH_STANDARD="## 경로 기준"; + private static final String PATH_MENU_SHORT_DISTANCE="1. 최단거리"; + private static final String PATH_MENU_SHORT_TIME="2. 최소 시간"; + private static final String PATH_MENU_BACK="B. 돌아가기"; + + public void printStation(List tmpSave) { + + System.out.println("[INFO] ---"); + for(String string:tmpSave) { + System.out.println("[INFO] "+string); + } + } + public void setMainMenuMainDisplay(){ + System.out.println(MAIN_MENU_MAIN_DISPLAY); + System.out.println(MAIN_MENU_PATH_SEARCH); + System.out.println(MAIN_MENU_QUIT); + } + public void setPathMenuPathStandard(){ + System.out.println(); + System.out.println(PATH_MENU_PATH_STANDARD); + System.out.println(PATH_MENU_SHORT_DISTANCE); + System.out.println(PATH_MENU_SHORT_TIME); + System.out.println(PATH_MENU_BACK); + } +} diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..93deb52ab 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,15 +1,97 @@ package subway.domain; +import java.util.ArrayList; +import java.util.List; + + public class Line { private String name; + private static final List stations = new ArrayList<>(); + private static final List distance = new ArrayList<>(); + private static final List time = new ArrayList<>(); + public Line() { + } public Line(String name) { this.name = name; } + // 추가 기능 구현 public String getName() { return name; } - // 추가 기능 구현 + public void setStations(List tmpSaveStation) { + for(int i=0;i tmpSaveTime) { + System.out.println(name); + for(int i=0;i tmpSaveDistance) { + + for(int i=0;i< tmpSaveDistance.size();i++) { + + System.out.println(tmpSaveDistance.get(i)); + distance.add(tmpSaveDistance.get(i)); + } + System.out.println(distance.size()); + + } + public List getLineStation() { + return stations; + } + public List getLineDistance() { + return distance; + } + public List getLineTime() { + return time; + } + + public int getDistance(Station startStation,Station endStation) { + + int startIndex=stations.indexOf(startStation); + int endIndex=stations.indexOf(endStation); + + + if(startIndex>endIndex) { + return computeDistance(endIndex,startIndex); + } + return computeDistance(startIndex,endIndex); + } + public int computeDistance(int startIndex,int endIndex) { + int totalDistance=0; + for(int i=startIndex;iendIndex) { + return computeTime(endIndex,startIndex); + } + + return computeTime(startIndex,endIndex); + } + public int computeTime(int startIndex,int endIndex) { + int totaltime=0; + for(int i=startIndex;i lines = new ArrayList<>(); + Line line=new Line(); public static List lines() { return Collections.unmodifiableList(lines); } + public static List getLines() { + return lines; + } public static void addLine(Line line) { lines.add(line); } @@ -19,8 +23,24 @@ public static void addLine(Line line) { public static boolean deleteLineByName(String name) { return lines.removeIf(line -> Objects.equals(line.getName(), name)); } + public Line getLine(String tmpSaveLine) { + + for(Line line:lines) { + if(line.getName().equals(tmpSaveLine)) { + return line; + } + } + return null; + } public static void deleteAll() { lines.clear(); } + public void initializeLine(String tmpSaveLine,List tmpSaveStations){ + + addLine(new Line(tmpSaveLine)); + + + new Line(tmpSaveLine).setStations(tmpSaveStations); + } }