Aktueller Stand

(Leider für den Moment kein MVN-Projekt, daher bitte die JAR-Datei
manuell zum Buildpath hinzufügen.)
main
hummel 2024-06-17 11:40:19 +02:00
parent d7139efdf5
commit 99e051580c
9 changed files with 2317 additions and 0 deletions

1
MaNav22/.settings/.gitignore vendored 100644
View File

@ -0,0 +1 @@
/org.eclipse.jdt.core.prefs

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,214 @@
Aachen
Köln
Trier
Augsburg
München
Garmisch-Part.
Nürnberg
Ulm
Regensburg
Lindau
Bayreuth
Nürnberg
Würzburg
Erfurt
Berlin
Cottbus
Leipzig
Frankfurt/Oder
Magdeburg
Schwerin
Rostock
Magdeburg
Neubrandenburg
Bremen
Hamburg
Hannover
Osnabrück
Cottbus
Dresden
Frankfurt/Oder
Berlin
Dresden
Cottbus
Erfurt
Bayreuth
Erfurt
Magdeburg
Fulda
Bayreuth
Kassel
Essen
Köln
Münster
Kassel
Frankfurt/Main
Mannheim
Würzburg
Koblenz
Fulda
Kassel
Frankfurt/Oder
Dresden
Berlin
Freiburg
Karlsruhe
Stuttgart
Lindau
Fulda
Kassel
Erfurt
Würzburg
Garmisch-Part.
München
Lindau
Ulm
Hamburg
Kiel
Bremen
Magdeburg
Hannover
Osnabrück
Bremen
Hamburg
Magdeburg
Karlsruhe
Stuttgart
Mannheim
Saarbrücken
Kassel
Frankfurt/Main
Essen
Fulda
Erfurt
Kiel
Hamburg
Schwerin
Koblenz
Köln
Trier
Frankfurt/Main
Fulda
Kassel
Köln
Koblenz
Trier
Leipzig
Berlin
Erfurt
Magdeburg
Lindau
Ulm
Garmisch-Part.
Magdeburg
Hannover
Berlin
Schwerin
Hamburg
Mannheim
Karlsruhe
Frankfurt/Main
Saarbrücken
Trier
Koblenz
München
Augsburg
Lindau
Bayreuth
Würzburg
Passau
Münster
Osnabrück
Essen
Neubrandenburg
Berlin
Rostock
Schwerin
Nürnberg
München
Würzburg
Bayreuth
Stuttgart
Osnabrück
Hannover
Kassel
Münster
Bremen
Wilhelmshaven
Passau
Regensburg
München
Regensburg
Nürnberg
München
Passau
Rostock
Schwerin
Neubrandenburg
Saarbrücken
Trier
Mannheim
Frankfurt/Main
Karlsruhe
Schwerin
Rostock
Hamburg
Berlin
Stuttgart
Karlsruhe
Ulm
Würzburg
Trier
Saarbrücken
Koblenz
Ulm
Stuttgart
Augsburg
Lindau
Nürnberg
Würzburg
Wilhelmshaven
Bremen
Osnabrück
Würzburg
Osnabrück
Bremen

View File

@ -0,0 +1,14 @@
package de.hsma.informatik.maNav;
import de.hsma.informatik.maNav.domain.planer.Routenplaner;
public class NaviApp {
public static void main(String[] args) {
Routenplaner karte = new Routenplaner();
karte.printRoute("Mannheim", "München");
} // main
}

View File

@ -0,0 +1,26 @@
package de.hsma.informatik.maNav.domain.graph;
import java.util.TreeSet;
public class Stadt {
private String name;
private TreeSet<Verbindung> nachbarn = new TreeSet<>();
public Stadt(String name) {
this.name = name;
}
public void addVerbindung(Stadt stadt2, int entfernung) {
nachbarn.add(new Verbindung(this, stadt2, entfernung));
}
public String getName() {
return name;
}
public TreeSet<Verbindung> getNachbarn() {
return nachbarn;
}
}

View File

@ -0,0 +1,46 @@
package de.hsma.informatik.maNav.domain.graph;
public class Verbindung implements Comparable<Verbindung> {
private final Stadt start;
private final Stadt ziel;
private final int entfernung;
public Verbindung(Stadt start, Stadt ziel, int entfernung) {
super();
this.start = start;
this.ziel = ziel;
this.entfernung = entfernung;
}
@Override
public int compareTo(Verbindung v) {
int diff = this.entfernung - v.entfernung;
if (diff != 0)
return diff;
if (this.start.equals(v.start) && this.ziel.equals(v.ziel))
return 0;
// wg. Nutzung von TreeSet
return 1;
}
public Stadt getStart() {
return start;
}
public Stadt getZiel() {
return ziel;
}
public int getEntfernung() {
return entfernung;
}
public String toString() {
return start.getName() + " -> " + ziel.getName() + ": " + entfernung + " km";
}
}

View File

@ -0,0 +1,72 @@
package de.hsma.informatik.maNav.domain.planer;
import java.util.TreeSet;
import de.hsma.informatik.maNav.domain.graph.Stadt;
import de.hsma.informatik.maNav.domain.graph.Verbindung;
public class PlanerStadt implements Comparable<PlanerStadt> {
private int entfernung = Integer.MAX_VALUE;
private Stadt stadt;
private PlanerStadt vorgänger = null;
private TreeSet<Verbindung> nachbarn;
public PlanerStadt(Stadt stadt) {
this.stadt = stadt;
nachbarn = (TreeSet<Verbindung>)stadt.getNachbarn().clone();
}
public Verbindung getAndRemoveNächstenNachbarn() {
return nachbarn.pollFirst();
}
public boolean setEntfernung(int entfernung, PlanerStadt vorgänger) {
if (entfernung < this.entfernung) {
this.entfernung = entfernung;
this.vorgänger = vorgänger;
return true;
}
return false;
}
@Override
public int compareTo(PlanerStadt gs) {
int diff = this.entfernung - gs.entfernung;
if (diff != 0)
return diff;
if (this.stadt.getName().equals(gs.stadt.getName()))
return 0;
return 1;
}
public int getEntfernung() {
return entfernung;
}
public void setEntfernung(int entfernung) {
this.entfernung = entfernung;
}
public Stadt getStadt() {
return stadt;
}
public PlanerStadt getVorgänger() {
return vorgänger;
}
public void setVorgänger(PlanerStadt vorgänger) {
this.vorgänger = vorgänger;
}
public String toString() {
return stadt.getName();
}
}

View File

@ -0,0 +1,149 @@
package de.hsma.informatik.maNav.domain.planer;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Scanner;
import java.util.TreeSet;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import de.hsma.informatik.maNav.domain.graph.Stadt;
import de.hsma.informatik.maNav.domain.graph.Verbindung;
public class Routenplaner {
private HashMap<String, Stadt> städte = new HashMap<>();
public Routenplaner() {
loadData();
}
public void printRoute(String start, String dest) {
TreeSet<PlanerStadt> kandidaten = new TreeSet<>();
PlanerStadt dsst = new PlanerStadt(städte.get(start));
dsst.setEntfernung(0);
kandidaten.add(dsst);
do {
Verbindung nächste = dsst.getAndRemoveNächstenNachbarn();
if (nächste != null) {
PlanerStadt dzst = new PlanerStadt(nächste.getZiel());
if (dzst.setEntfernung(dsst.getEntfernung() + nächste.getEntfernung(), dsst)) {
System.out.println(nächste.toString() + " (" + (dsst.getEntfernung() + nächste.getEntfernung()) +")");
kandidaten.add(dzst);
}
} else {
System.out.println("erledigt: " + kandidaten.pollFirst());
}
dsst = kandidaten.first();
} while(!dsst.getStadt().getName().equals(dest));
System.out.println();
System.out.println(dsst.getStadt().getName() + " " + dsst.getEntfernung());
while (dsst.getVorgänger() != null) {
System.out.println(dsst.getVorgänger().getStadt().getName() + " " + dsst.getVorgänger().getEntfernung());
dsst = dsst.getVorgänger();
}
}
private void loadData() {
final String CITIES_DOCUMENT_PATH = "resources/etab.html";
int[][] matrix;
HashMap<String, Integer> cityLookup = new HashMap<>();
File input = new File(CITIES_DOCUMENT_PATH);
Document doc;
try {
doc = Jsoup.parse(input, "UTF-8");
String[] cities = parseCities(doc);
matrix = new int[cities.length][cities.length];
Elements cells = doc.select("td");
int xIndex = 0;
int yIndex = -1;
for (int i = cities.length + 1; i < cells.size(); i++) {
if(i%(cities.length + 1) == 0) {
xIndex = 0;
yIndex++;
this.addCity(cities[yIndex]);
cityLookup.put(cities[yIndex], yIndex);
continue;
}
String cityName1 = cities[xIndex];
String cityName2 = cities[yIndex];
xIndex++;
if(cityName1.equals(cityName2))
continue;
matrix[xIndex - 1][yIndex] = Integer.parseInt(cells.get(i).text());
} // for
loadConnections(matrix, cityLookup);
} catch (IOException e) {
e.printStackTrace();
}
}
private void loadConnections(int[][] matrix, HashMap<String, Integer> cityLookup) throws IOException {
final Scanner sc = new Scanner(new File("resources/verb.txt"));
String start = null;
while (sc.hasNextLine()) {
String zeile = sc.nextLine();
if (start == null) {
start = zeile;
continue;
}
if (zeile.isBlank()) {
start = null;
continue;
}
this.addConnection(start, zeile, matrix[cityLookup.get(start)][cityLookup.get(zeile)]);
} // while
}
private String[] parseCities(Document doc) {
Elements cities = doc.select("td > b");
int cityAmount = cities.size();
String[] cityNames = new String[cityAmount];
for (int i = 0; i < cities.size(); i++) {
cityNames[i] = cities.get(i).text();
}
return cityNames;
}
private void addCity(String name) {
städte.put(name, new Stadt(name));
}
private void addConnection(String name1, String name2, int entfernung) {
Stadt s1 = städte.get(name1);
Stadt s2 = städte.get(name2);
s1.addVerbindung(s2, entfernung);
s2.addVerbindung(s1, entfernung);
}
}