diff --git a/Routenplaner/src/de/th_mannheim/informatik/routenplaner/NaviApp.java b/Routenplaner/src/de/th_mannheim/informatik/routenplaner/NaviApp.java index 27a4e51..faee3f8 100644 --- a/Routenplaner/src/de/th_mannheim/informatik/routenplaner/NaviApp.java +++ b/Routenplaner/src/de/th_mannheim/informatik/routenplaner/NaviApp.java @@ -7,7 +7,12 @@ public class NaviApp { public static void main(String[] args) { Routeplaner map = new Routeplaner(); + System.out.println(); System.out.println(map.getNumberOfCities()); + System.out.println(); + + for (String waypoint : map.initializePlanning("Mannheim", "Wilhelmshaven")) + System.out.println(waypoint); } } diff --git a/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/City.java b/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/City.java index 7e10cc0..cece60e 100644 --- a/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/City.java +++ b/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/City.java @@ -4,11 +4,14 @@ import java.util.TreeSet; public class City { private String name; + private int distance; + private String predecessor; private TreeSet neighbors = new TreeSet<>(); public City(String name) { this.name = name; + reset(); } public void addConnection(City stadt2, int distance) { @@ -23,4 +26,33 @@ public class City { return neighbors; } + public void checkAndChangeDistance(int distance, String predecessor) { + if (distance < this.distance) { + this.distance = distance; + this.predecessor = predecessor; + System.out.println(name + " " + distance + " <- " + predecessor); + + for (Street s : neighbors) { + s.setUnused(); + } + } + } + + public int getDistance() { + return distance; + } + + public void setDistance(int distance) { + this.distance = distance; + } + + public String getPredecessor() { + return predecessor; + } + + private void reset() { + distance = Integer.MAX_VALUE; + predecessor = null; + } + } \ No newline at end of file diff --git a/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/Routeplaner.java b/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/Routeplaner.java index 6a18a06..24e4a98 100644 --- a/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/Routeplaner.java +++ b/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/Routeplaner.java @@ -2,6 +2,8 @@ package de.th_mannheim.informatik.routenplaner.domain; import java.io.File; import java.io.IOException; +import java.util.ArrayDeque; +import java.util.Deque; import java.util.HashMap; import java.util.Scanner; @@ -15,7 +17,63 @@ public class Routeplaner { public Routeplaner() { loadData(); } - + + public Deque initializePlanning(String start, String destination) { + cities.get(start).setDistance(0); + + planRoute(start, destination); + + System.out.println(); + System.out.println(); + System.out.println("Route:"); + System.out.println(); + + Deque hops = new ArrayDeque<>(); + City dc = cities.get(destination); + + while (true) { + hops.push(dc.getName() + " " + dc.getDistance() + " km"); + + if (dc.getName().equals(start)) + break; + + dc = cities.get(dc.getPredecessor()); + } + + return hops; + } + + private void planRoute(String start, String destination) { + System.out.println("Prüfe " + start); + City sc = cities.get(start); + + if (sc == null || cities.get(destination) == null) + throw new RuntimeException("Stadt nicht gefunden."); + + for (Street s : sc.getNeighbors()) { + if (s.isUsed()) + continue; + + s.setUsed(); + + System.out.println(s.toString()); + + City nc = s.getDestination(); + + nc.checkAndChangeDistance(sc.getDistance() + s.getDistance(), sc.getName()); + + if (nc.getName().equals(destination)) { + System.out.println("Route nach " + destination + " gefunden mit Entfernung: " + nc.getDistance()); + } else { + System.out.println(); + planRoute(nc.getName(), destination); + System.out.println(); + } + + } + + } + public int getNumberOfCities() { return cities.size(); } @@ -67,7 +125,7 @@ public class Routeplaner { } } - + private void loadConnections(int[][] matrix, HashMap cityLookup) throws IOException { final Scanner sc = new Scanner(new File("Routenplaner/resources/verb.txt")); @@ -85,10 +143,11 @@ public class Routeplaner { continue; } + System.out.println(start + " " + line + " " + matrix[cityLookup.get(start)][cityLookup.get(line)]); this.addStreet(start, line, matrix[cityLookup.get(start)][cityLookup.get(line)]); } // while - + sc.close(); } @@ -102,7 +161,7 @@ public class Routeplaner { } return cityNames; } - + private void addCity(String name) { cities.put(name, new City(name)); } @@ -114,5 +173,5 @@ public class Routeplaner { s1.addConnection(s2, distance); s2.addConnection(s1, distance); } - + } diff --git a/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/Street.java b/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/Street.java index 2a7b3f6..a9142ec 100644 --- a/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/Street.java +++ b/Routenplaner/src/de/th_mannheim/informatik/routenplaner/domain/Street.java @@ -5,6 +5,8 @@ public class Street implements Comparable { private final City destination; private final int distance; + private boolean used; + public Street(City start, City destination, int distance) { super(); @@ -31,7 +33,7 @@ public class Street implements Comparable { return start; } - public City getTarget() { + public City getDestination() { return destination; } @@ -39,6 +41,18 @@ public class Street implements Comparable { return distance; } + public boolean isUsed() { + return used; + } + + public void setUsed() { + used = true; + } + + public void setUnused() { + used = false; + } + public String toString() { return start.getName() + " -> " + destination.getName() + ": " + distance + " km"; }