Compare commits
18 Commits
Author | SHA1 | Date |
---|---|---|
Caro | 5e506beaa2 | |
Caro | effacbb8ab | |
Caro | afdac68baa | |
Bohdana Illiuk | 808e0cfa7d | |
Bohdana Illiuk | a2c19c6524 | |
Bohdana Illiuk | 94a00179b2 | |
danai | 8de5538563 | |
Caro | a00963768f | |
Caro | 1bb8d15014 | |
Caro | d7a46eef78 | |
Caro | 1dcecea263 | |
Caro | 963cdbad2b | |
Caro | b54c94fe6e | |
Caro | f5fa33e182 | |
Caro | 378fcff162 | |
Caro | 70836e2325 | |
Caro | 4c96ee8075 | |
Caro | 0a4faef3d2 |
|
@ -1,2 +1,9 @@
|
||||||
# TravelBuddyApp
|
# TravelBuddyApp
|
||||||
|
( Caroline Ufer und Bohdana Illiuk )
|
||||||
|
|
||||||
|
Login-Namen:
|
||||||
|
1. max, 12345
|
||||||
|
2. lisa, 1111
|
||||||
|
3. anna, pass123
|
||||||
|
4. mike, 54321
|
||||||
|
5. sven, 112233
|
|
@ -75,7 +75,7 @@
|
||||||
<transformer
|
<transformer
|
||||||
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||||
<mainClass>
|
<mainClass>
|
||||||
de.hs_mannheim.informatik.mvn.Main</mainClass>
|
ui.UserInterface</mainClass>
|
||||||
</transformer>
|
</transformer>
|
||||||
</transformers>
|
</transformers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
|
@ -5,7 +5,9 @@ public class Auto {
|
||||||
private String name;
|
private String name;
|
||||||
private double co2AusstossProKm;
|
private double co2AusstossProKm;
|
||||||
|
|
||||||
|
|
||||||
public Auto(String name, double co2AusstossProKm) {
|
public Auto(String name, double co2AusstossProKm) {
|
||||||
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.co2AusstossProKm = co2AusstossProKm;
|
this.co2AusstossProKm = co2AusstossProKm;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ public class KurztripEmpfehlung {
|
||||||
return gefilterteOrte;
|
return gefilterteOrte;
|
||||||
}
|
}
|
||||||
|
|
||||||
return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size()));
|
return zufallsorteAuswaehlen(gefilterteOrte, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ public class KurztripEmpfehlung {
|
||||||
return gefilterteOrte;
|
return gefilterteOrte;
|
||||||
}
|
}
|
||||||
|
|
||||||
return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size()));
|
return zufallsorteAuswaehlen(gefilterteOrte, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Ort> zufallsorteAuswaehlen(List<Ort> orte, int anzahl) {
|
private List<Ort> zufallsorteAuswaehlen(List<Ort> orte, int anzahl) {
|
||||||
|
@ -91,18 +91,14 @@ public class KurztripEmpfehlung {
|
||||||
}
|
}
|
||||||
|
|
||||||
public double berechneEntfernung(Ort standort, Ort zielort) {
|
public double berechneEntfernung(Ort standort, Ort zielort) {
|
||||||
|
|
||||||
double b1 = Math.toRadians(standort.getBreitengrad());
|
double b1 = Math.toRadians(standort.getBreitengrad());
|
||||||
double b2 = Math.toRadians(zielort.getBreitengrad());
|
double b2 = Math.toRadians(zielort.getBreitengrad());
|
||||||
double l1 = Math.toRadians(standort.getLängengrad());
|
double l1 = Math.toRadians(standort.getLängengrad());
|
||||||
double l2 = Math.toRadians(zielort.getLängengrad());
|
double l2 = Math.toRadians(zielort.getLängengrad());
|
||||||
|
|
||||||
double deltaL = l2 - l1;
|
double entfernung = (6378.388
|
||||||
double cosDeltaL = Math.cos(deltaL);
|
* Math.acos(Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * Math.cos(l2 - l1))) * 1.25;
|
||||||
double acosArgument = Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * cosDeltaL;
|
|
||||||
|
|
||||||
acosArgument = Math.max(-1.0, Math.min(1.0, acosArgument));
|
|
||||||
|
|
||||||
double entfernung = 6378.388 * Math.acos(acosArgument);
|
|
||||||
|
|
||||||
return entfernung;
|
return entfernung;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,48 +2,32 @@ package domain;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|
||||||
public class Ort {
|
public class Ort {
|
||||||
|
|
||||||
private int plz;
|
private int plz;
|
||||||
private String ortName;
|
private String name;
|
||||||
private double breitengrad;
|
public double breitengrad;
|
||||||
private double längengrad;
|
public double längengrad;
|
||||||
|
|
||||||
|
|
||||||
public Ort(int plz, String name) {
|
public Ort(int plz, String name) {
|
||||||
this.plz = plz;
|
this.plz = plz;
|
||||||
this.ortName = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Ort(int plz, String name, double breitengrad, double längengrad) {
|
public Ort(int plz, String name, double breitengrad, double längengrad) {
|
||||||
this.plz = plz;
|
this.plz = plz;
|
||||||
this.ortName = name;
|
this.name = name;
|
||||||
this.breitengrad = breitengrad;
|
this.breitengrad = breitengrad;
|
||||||
this.längengrad = längengrad;
|
this.längengrad = längengrad;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getPLZ() {
|
|
||||||
return plz;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOrtName() {
|
|
||||||
return ortName;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public double getBreitengrad() {
|
|
||||||
return breitengrad;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getLängengrad() {
|
|
||||||
return längengrad;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAktuellesWetter() {
|
public String getAktuellesWetter() {
|
||||||
try {
|
try {
|
||||||
return WetterService.getAktuellesWetter(ortName);
|
return WetterService.getAktuellesWetter(name);
|
||||||
} catch (IOException | InterruptedException e) {
|
} catch (IOException | InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return "Fehler beim Abrufen des aktuellen Wetters";
|
return "Fehler beim Abrufen des aktuellen Wetters";
|
||||||
|
@ -51,11 +35,30 @@ public class Ort {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getWettervorhersage() {
|
public String getWettervorhersage() {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return WetterService.getWettervorhersage(ortName);
|
return WetterService.getWettervorhersage(name);
|
||||||
} catch (IOException | InterruptedException e) {
|
} catch (IOException | InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return "Fehler beim Abrufen der Wettervorhersage";
|
return "Fehler beim Abrufen der Wettervorhersage";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPLZ() {
|
||||||
|
return plz;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getBreitengrad() {
|
||||||
|
return breitengrad;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getLängengrad() {
|
||||||
|
return längengrad;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package domain;
|
package domain;
|
||||||
|
|
||||||
|
import java.lang.Math;
|
||||||
|
|
||||||
public class Reiseplanung {
|
public class Reiseplanung {
|
||||||
|
|
||||||
private Ort standort;
|
private Ort standort;
|
||||||
|
@ -9,40 +11,49 @@ public class Reiseplanung {
|
||||||
private double dauerFahrrad;
|
private double dauerFahrrad;
|
||||||
private double co2AusstoßPKW;
|
private double co2AusstoßPKW;
|
||||||
|
|
||||||
public Reiseplanung(Ort standort, Ort zielort, double durchschnittsgeschwindigkeitPKW,
|
public Reiseplanung(User user, Ort zielort) {
|
||||||
double durchschnittsgeschwindigkeitFahrrad, double co2AusstossProKmPKW) {
|
this.standort = user.getHeimatstandort();
|
||||||
this.standort = standort;
|
|
||||||
this.zielort = zielort;
|
this.zielort = zielort;
|
||||||
this.entfernung = berechneEntfernung(standort, zielort);
|
this.entfernung = berechneEntfernung(standort, zielort);
|
||||||
this.dauerPKW = entfernung / durchschnittsgeschwindigkeitPKW;
|
this.dauerPKW = berechneDauer(user.getDurchschnittsgeschwindigkeitPKW());
|
||||||
this.dauerFahrrad = entfernung / durchschnittsgeschwindigkeitFahrrad;
|
this.dauerFahrrad = berechneDauer(user.getDurchschnittsgeschwindigkeitFahrrad());
|
||||||
this.co2AusstoßPKW = entfernung * co2AusstossProKmPKW;
|
this.co2AusstoßPKW = berechneCO2Ausstoß(user.getAuto());
|
||||||
}
|
}
|
||||||
|
|
||||||
public double berechneEntfernung(Ort standort, Ort zielort) {
|
public double berechneEntfernung(Ort standort, Ort zielort) {
|
||||||
|
|
||||||
double b1 = Math.toRadians(standort.getBreitengrad());
|
double b1 = Math.toRadians(standort.getBreitengrad());
|
||||||
double b2 = Math.toRadians(zielort.getBreitengrad());
|
double b2 = Math.toRadians(zielort.getBreitengrad());
|
||||||
double l1 = Math.toRadians(standort.getLängengrad());
|
double l1 = Math.toRadians(standort.getLängengrad());
|
||||||
double l2 = Math.toRadians(zielort.getLängengrad());
|
double l2 = Math.toRadians(zielort.getLängengrad());
|
||||||
|
|
||||||
return 6378.388 * Math.acos(Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * Math.cos(l2 - l1));
|
entfernung = (6378.388
|
||||||
}
|
* Math.acos(Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * Math.cos(l2 - l1))) * 1.25;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public double getEntfernung() {
|
|
||||||
return entfernung;
|
return entfernung;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// berechnet die ungefähre Dauer zum gewählten Ort
|
||||||
|
public double berechneDauer(double geschwindigkeit) {
|
||||||
|
return entfernung / geschwindigkeit;
|
||||||
|
|
||||||
|
|
||||||
public String berechneReiseDauer(double durchschnittsgeschwindigkeit) {
|
|
||||||
double dauer = entfernung / durchschnittsgeschwindigkeit;
|
|
||||||
return String.format("Die Reise dauert ca. %.2f Stunden.", dauer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public double berechneCO2Ausstoss() {
|
// berechnet ungefähren CO2 Ausstoß des Autos für eine Strecke
|
||||||
return co2AusstoßPKW;
|
public double berechneCO2Ausstoß(Auto auto) {
|
||||||
|
return entfernung * auto.getCO2AusstossProKm();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getEntfernung() {
|
||||||
|
return Math.round(entfernung*100.0)/100.0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format(
|
||||||
|
"Von %s nach %s\nEntfernung: %.1f km\nReisedauer mit dem PKW: %.1f Stunden\nReisedauer mit dem Fahrrad: %.1f Stunden\nCO2-Ausstoß durch PKW: %.1f kg",
|
||||||
|
standort.getName(), zielort.getName(), entfernung, dauerPKW, dauerFahrrad, co2AusstoßPKW);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getDauerPKW() {
|
public double getDauerPKW() {
|
||||||
|
@ -53,7 +64,7 @@ public class Reiseplanung {
|
||||||
return dauerFahrrad;
|
return dauerFahrrad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double getCO2Ausstoß() {
|
||||||
|
return co2AusstoßPKW;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ public class User {
|
||||||
private String username;
|
private String username;
|
||||||
private String hashedPassword;
|
private String hashedPassword;
|
||||||
private Ort heimatstandort;
|
private Ort heimatstandort;
|
||||||
private Auto auto;
|
public Auto auto;
|
||||||
private double durchschnittsgeschwindigkeitPKW;
|
private double durchschnittsgeschwindigkeitPKW;
|
||||||
private double durchschnittsgeschwindigkeitFahrrad;
|
private double durchschnittsgeschwindigkeitFahrrad;
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ public class User {
|
||||||
|
|
||||||
try (PrintWriter writer = new PrintWriter(new FileWriter("users.txt", true))) {
|
try (PrintWriter writer = new PrintWriter(new FileWriter("users.txt", true))) {
|
||||||
writer.println(username + "," + hashedPassword + "," + heimatstandort.getPLZ() + ","
|
writer.println(username + "," + hashedPassword + "," + heimatstandort.getPLZ() + ","
|
||||||
+ heimatstandort.getOrtName() + "," + auto.getName() + "," + auto.getCO2AusstossProKm() + ","
|
+ heimatstandort.getName() + "," + auto.getName() + "," + auto.getCO2AusstossProKm() + ","
|
||||||
+ durchschnittsgeschwindigkeitPKW + "," + durchschnittsgeschwindigkeitFahrrad);
|
+ durchschnittsgeschwindigkeitPKW + "," + durchschnittsgeschwindigkeitFahrrad);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -92,6 +92,7 @@ public class User {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean einloggen() {
|
public boolean einloggen() {
|
||||||
|
|
||||||
try (BufferedReader reader = new BufferedReader(new FileReader("users.txt"))) {
|
try (BufferedReader reader = new BufferedReader(new FileReader("users.txt"))) {
|
||||||
String line;
|
String line;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
|
@ -114,7 +115,7 @@ public class User {
|
||||||
|
|
||||||
public String zeigeWetterHeimatstandort() {
|
public String zeigeWetterHeimatstandort() {
|
||||||
try {
|
try {
|
||||||
return WetterService.getAktuellesWetter(heimatstandort.getOrtName());
|
return WetterService.getAktuellesWetter(heimatstandort.getName());
|
||||||
} catch (IOException | InterruptedException e) {
|
} catch (IOException | InterruptedException e) {
|
||||||
return "Fehler beim Abrufen des Wetters: " + e.getMessage();
|
return "Fehler beim Abrufen des Wetters: " + e.getMessage();
|
||||||
}
|
}
|
||||||
|
@ -122,7 +123,7 @@ public class User {
|
||||||
|
|
||||||
public String zeigeWettervorhersageHeimatstandort() {
|
public String zeigeWettervorhersageHeimatstandort() {
|
||||||
try {
|
try {
|
||||||
return WetterService.getWettervorhersage(heimatstandort.getOrtName());
|
return WetterService.getWettervorhersage(heimatstandort.getName());
|
||||||
} catch (IOException | InterruptedException e) {
|
} catch (IOException | InterruptedException e) {
|
||||||
return "Fehler beim Abrufen der Wettervorhersage: " + e.getMessage();
|
return "Fehler beim Abrufen der Wettervorhersage: " + e.getMessage();
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import org.json.JSONObject;
|
||||||
|
|
||||||
public class WetterService {
|
public class WetterService {
|
||||||
|
|
||||||
|
|
||||||
private static final String API_KEY = "fc01dfd47f80659f12512c295e80b201";
|
private static final String API_KEY = "fc01dfd47f80659f12512c295e80b201";
|
||||||
private static final HttpClient client = HttpClient.newHttpClient();
|
private static final HttpClient client = HttpClient.newHttpClient();
|
||||||
|
|
||||||
|
|
|
@ -1,59 +1,163 @@
|
||||||
package fassade;
|
package fassade;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import domain.KurztripEmpfehlung;
|
|
||||||
import domain.Ort;
|
import domain.Ort;
|
||||||
import domain.Reiseplanung;
|
import domain.Reiseplanung;
|
||||||
import domain.User;
|
import domain.User;
|
||||||
|
import domain.WetterService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import domain.KurztripEmpfehlung;
|
||||||
|
|
||||||
public class ReiseFassade {
|
public class ReiseFassade {
|
||||||
|
|
||||||
private Reiseplanung reiseplanung;
|
private Reiseplanung reiseplanung;
|
||||||
private KurztripEmpfehlung kurztripEmpfehlung;
|
private KurztripEmpfehlung kurztripEmpfehlung;
|
||||||
|
User user;
|
||||||
|
List<Ort> alleOrte;
|
||||||
|
|
||||||
public ReiseFassade() {
|
public ReiseFassade(User user) {
|
||||||
|
|
||||||
this.kurztripEmpfehlung = new KurztripEmpfehlung();
|
this.kurztripEmpfehlung = new KurztripEmpfehlung();
|
||||||
|
alleOrte = ladeAlleOrte();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*public Reiseplanung planeReise(Ort startort, Ort zielort) {
|
|
||||||
Reiseplanung reiseplanung = new Reiseplanung(startort, zielort);
|
|
||||||
reiseplanung.berechneEntfernung();
|
|
||||||
reiseplanung.berechneReisedauerPKW();
|
|
||||||
reiseplanung.berechneReisedauerFahrrad();
|
|
||||||
reiseplanung.berechneCo2Ausstoss();
|
|
||||||
return reiseplanung;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
public void setHeimatortFromUser(User user) {
|
public void setHeimatortFromUser(User user) {
|
||||||
kurztripEmpfehlung.setHeimatort(user.getHeimatstandort());
|
Ort heimatort = user.getHeimatstandort();
|
||||||
|
this.kurztripEmpfehlung.setHeimatort(heimatort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public List<Ort> ladeAlleOrte() {
|
||||||
|
List<Ort> alleOrte = new ArrayList<>();
|
||||||
|
|
||||||
|
String csvFile = "src/main/resources/PLZ.csv";
|
||||||
|
String line;
|
||||||
|
try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
|
||||||
|
while ((line = br.readLine()) != null) {
|
||||||
|
line = line.replaceAll("\\s+", "");
|
||||||
|
String[] data = line.split(";");
|
||||||
|
int plz = Integer.parseInt(data[0].replaceAll("\"", ""));
|
||||||
|
String ortName = data[1].replaceAll("\"", "");
|
||||||
|
double breitengrad = Double.parseDouble(data[2].replaceAll("\"", ""));
|
||||||
|
double laengengrad = Double.parseDouble(data[3].replaceAll("\"", ""));
|
||||||
|
Ort ort = new Ort(plz, ortName);
|
||||||
|
ort.breitengrad = breitengrad;
|
||||||
|
ort.längengrad = laengengrad;
|
||||||
|
alleOrte.add(ort);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.err.println("Fehler beim Lesen der Datei: " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
|
||||||
|
System.err.println("Fehlerhaftes Datenformat in der CSV-Datei: " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return alleOrte;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public Ort[] sucheOrt(String suchbegriff) {
|
||||||
|
Set<Ort> trefferSet = new HashSet<>();
|
||||||
|
|
||||||
|
if (suchbegriff.equalsIgnoreCase("alle")) {
|
||||||
|
trefferSet.addAll(alleOrte);
|
||||||
|
} else {
|
||||||
|
for (Ort o : alleOrte) {
|
||||||
|
if (o.getName().contains(suchbegriff) && trefferSet.size() < 8) {
|
||||||
|
trefferSet.add(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return trefferSet.toArray(new Ort[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public String anzeigeTrefferliste(Ort[] trefferliste) {
|
||||||
|
StringBuilder ausgabe = new StringBuilder();
|
||||||
|
int i = 1;
|
||||||
|
|
||||||
|
for (Ort o : trefferliste) {
|
||||||
|
double entfernung = new Reiseplanung(user, o).getEntfernung();
|
||||||
|
ausgabe.append(i).append(". ").append(o.getName()).append(" (Entfernung: ")
|
||||||
|
.append(entfernung).append(" km)\n");
|
||||||
|
String wettervorhersage = getWettervorhersage(o.getName());
|
||||||
|
ausgabe.append(wettervorhersage).append("\n");
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ausgabe.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String ortAnzeige(int index, Ort[] trefferliste) {
|
||||||
|
String anzeige = " ";
|
||||||
|
anzeige = trefferliste[index - 1].getName() + " " + trefferliste[index - 1].getPLZ() + " "
|
||||||
|
+ trefferliste[index - 1].getWettervorhersage();
|
||||||
|
return anzeige;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public String getReiseplanung(User user, Ort ziel) {
|
||||||
|
reiseplanung = new Reiseplanung(user, ziel);
|
||||||
|
return reiseplanung.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public String getAktuellesWetter(String ortName) {
|
||||||
|
try {
|
||||||
|
return WetterService.getAktuellesWetter(ortName);
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
return "Fehler beim Abrufen des Wetters: " + e.getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getWettervorhersage(String ortName) {
|
||||||
|
try {
|
||||||
|
return WetterService.getWettervorhersage(ortName);
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
return "Fehler beim Abrufen des Wetters: " + e.getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public double berechneEntfernung() {
|
public double berechneEntfernung() {
|
||||||
return reiseplanung.getEntfernung();
|
return reiseplanung.getEntfernung();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String berechneReiseDauerPKW() {
|
public String berechneReiseDauerPKW() {
|
||||||
return reiseplanung.berechneReiseDauer(reiseplanung.getDauerPKW());
|
double dauer = reiseplanung.berechneDauer(reiseplanung.getDauerPKW());
|
||||||
|
return String.format("Die Reise dauert ca. %.2f Stunden.", dauer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String berechneReiseDauerFahrrad() {
|
public String berechneReiseDauerFahrrad() {
|
||||||
return reiseplanung.berechneReiseDauer(reiseplanung.getDauerFahrrad());
|
double dauer = reiseplanung.berechneDauer(reiseplanung.getDauerFahrrad());
|
||||||
|
return String.format("Die Reise dauert ca. %.2f Stunden.", dauer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double berechneCO2AusstossPKW() {
|
public double berechneCO2AusstossPKW() {
|
||||||
return reiseplanung.berechneCO2Ausstoss();
|
return reiseplanung.getCO2Ausstoß();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public List<Ort> zufallsorteFahrrad(int maxEntfernung) {
|
public List<Ort> zufallsorteFahrrad(int maxEntfernung) {
|
||||||
return kurztripEmpfehlung.zufallsorteFahrrad(maxEntfernung);
|
return kurztripEmpfehlung.zufallsorteFahrrad(maxEntfernung);
|
||||||
}
|
}
|
||||||
|
@ -62,5 +166,4 @@ public class ReiseFassade {
|
||||||
return kurztripEmpfehlung.zufallsortePKW(minEntfernung);
|
return kurztripEmpfehlung.zufallsortePKW(minEntfernung);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import domain.Auto;
|
||||||
|
|
||||||
public class UserFassade {
|
public class UserFassade {
|
||||||
|
|
||||||
|
|
||||||
public User registrieren(String username, String password, int plz, String ortName, String autoName,
|
public User registrieren(String username, String password, int plz, String ortName, String autoName,
|
||||||
double co2AusstossProKm, double durchschnittsgeschwindigkeitPKW,
|
double co2AusstossProKm, double durchschnittsgeschwindigkeitPKW,
|
||||||
double durchschnittsgeschwindigkeitFahrrad) {
|
double durchschnittsgeschwindigkeitFahrrad) {
|
||||||
|
@ -18,6 +19,7 @@ public class UserFassade {
|
||||||
}
|
}
|
||||||
|
|
||||||
public User einloggen(String username, String password) {
|
public User einloggen(String username, String password) {
|
||||||
|
|
||||||
User user = new User(username, password, null, null, 0, 0);
|
User user = new User(username, password, null, null, 0, 0);
|
||||||
if (user.einloggen()) {
|
if (user.einloggen()) {
|
||||||
return user;
|
return user;
|
||||||
|
|
|
@ -3,6 +3,7 @@ package ui;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
import domain.KurztripEmpfehlung;
|
||||||
import domain.Ort;
|
import domain.Ort;
|
||||||
import domain.Reiseplanung;
|
import domain.Reiseplanung;
|
||||||
import domain.User;
|
import domain.User;
|
||||||
|
@ -18,7 +19,7 @@ public class UserInterface {
|
||||||
|
|
||||||
public UserInterface() {
|
public UserInterface() {
|
||||||
|
|
||||||
this.reiseFacade = new ReiseFassade();
|
this.reiseFacade = new ReiseFassade(user);
|
||||||
this.userFacade = new UserFassade();
|
this.userFacade = new UserFassade();
|
||||||
this.scanner = new Scanner(System.in);
|
this.scanner = new Scanner(System.in);
|
||||||
start();
|
start();
|
||||||
|
@ -29,6 +30,7 @@ public class UserInterface {
|
||||||
boolean exit = false;
|
boolean exit = false;
|
||||||
System.out.println("\t\t\t Willkommen zur Travel-Buddy-App!");
|
System.out.println("\t\t\t Willkommen zur Travel-Buddy-App!");
|
||||||
System.out.println("\t\t\t --------------------------------");
|
System.out.println("\t\t\t --------------------------------");
|
||||||
|
|
||||||
while (!exit) {
|
while (!exit) {
|
||||||
System.out.println("1. Registrieren");
|
System.out.println("1. Registrieren");
|
||||||
System.out.println("2. Einloggen");
|
System.out.println("2. Einloggen");
|
||||||
|
@ -122,91 +124,151 @@ public class UserInterface {
|
||||||
reiseFacade.setHeimatortFromUser(user);
|
reiseFacade.setHeimatortFromUser(user);
|
||||||
System.out.println("\nLogin erfolgreich! Willkommen zurück, " + user.getUsername() + "!");
|
System.out.println("\nLogin erfolgreich! Willkommen zurück, " + user.getUsername() + "!");
|
||||||
String wetter = user.zeigeWetterHeimatstandort();
|
String wetter = user.zeigeWetterHeimatstandort();
|
||||||
System.out.println("Aktuelles Wetter in " + user.getHeimatstandort().getOrtName() + ": " + wetter);
|
System.out.println("Aktuelles Wetter in " + user.getHeimatstandort().getName() + ": " + wetter);
|
||||||
} else {
|
} else {
|
||||||
System.out.println("\nBenutzername oder Passwort ist falsch:(");
|
System.out.println("\nBenutzername oder Passwort ist falsch:(");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void sucheOrt() {
|
private void sucheOrt() {
|
||||||
System.out.print("Geben Sie den Namen des Ortes ein: ");
|
System.out.print("Geben Sie den Namen des Ortes ein: ");
|
||||||
String ortName = scanner.nextLine();
|
String ortName = scanner.nextLine();
|
||||||
/*
|
|
||||||
* List<Ort> treffer = reiseFacade.sucheOrt(ortName); if (treffer.isEmpty()) {
|
// Search for the location
|
||||||
* System.out.println("Keine Treffer gefunden."); } else {
|
Ort[] treffer = reiseFacade.sucheOrt(ortName);
|
||||||
* System.out.println("Trefferliste:"); for (Ort ort : treffer) {
|
|
||||||
* System.out.println(ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")"); String
|
if (treffer.length == 0) {
|
||||||
* wetter = user.zeigeWettervorhersageHeimatstandort();
|
System.out.println("Keine Treffer gefunden.");
|
||||||
* System.out.println("Aktuelles Wetter in " +
|
} else {
|
||||||
* user.getHeimatstandort().getOrtName() + ": " + wetter); } }
|
System.out.println("Trefferliste:");
|
||||||
*/
|
for (int i = 0; i < treffer.length; i++) {
|
||||||
|
Reiseplanung reiseplanung = new Reiseplanung(user, treffer[i]);
|
||||||
|
System.out.println((i + 1) + ". " + treffer[i].getName() + " (PLZ: " + treffer[i].getPLZ() +
|
||||||
|
"), Entfernung: " + reiseplanung.getEntfernung() + " km");
|
||||||
|
|
||||||
|
String wettervorhersage = reiseFacade.getWettervorhersage(treffer[i].getName());
|
||||||
|
System.out.println(wettervorhersage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Display the current weather at the user's home location
|
||||||
|
String wetter = reiseFacade.getAktuellesWetter(user.getHeimatstandort().getName());
|
||||||
|
System.out.println("Aktuelles Wetter in " + user.getHeimatstandort().getName() + ": " + wetter);
|
||||||
|
|
||||||
|
// Choose a location from the list
|
||||||
|
System.out.println("Wählen Sie einen Ort aus: ");
|
||||||
|
System.out.println("Geben Sie 'beenden' ein, um zu beenden");
|
||||||
|
String input = scanner.nextLine();
|
||||||
|
|
||||||
|
if (input.equalsIgnoreCase("beenden")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
int eingabe = Integer.parseInt(input);
|
||||||
|
if (eingabe < 1 || eingabe > treffer.length) {
|
||||||
|
System.out.println("Ungültige Auswahl. Bitte versuchen Sie es erneut.");
|
||||||
|
} else {
|
||||||
|
System.out.println(reiseFacade.ortAnzeige(eingabe, treffer));
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
System.out.println("Ungültige Eingabe. Bitte geben Sie eine Zahl ein.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void planeReise() {
|
private void planeReise() {
|
||||||
System.out.print("Geben Sie Ihre Start-PLZ ein: ");
|
|
||||||
int startPlz = Integer.parseInt(scanner.nextLine());
|
|
||||||
System.out.print("Geben Sie Ihren Startort ein: ");
|
|
||||||
String startOrtName = scanner.nextLine();
|
|
||||||
Ort startort = new Ort(startPlz, startOrtName);
|
|
||||||
System.out.print("Geben Sie die Ziel-PLZ ein: ");
|
System.out.print("Geben Sie die Ziel-PLZ ein: ");
|
||||||
int zielPlz = Integer.parseInt(scanner.nextLine());
|
int zielPlz = Integer.parseInt(scanner.nextLine());
|
||||||
System.out.print("Geben Sie den Zielort ein: ");
|
System.out.print("Geben Sie den Zielort ein: ");
|
||||||
String zielOrtName = scanner.nextLine();
|
String zielOrtName = scanner.nextLine();
|
||||||
Ort zielort = new Ort(zielPlz, zielOrtName);
|
|
||||||
|
|
||||||
/*
|
// Lade alle Orte, um den Ort mit den GPS-Koordinaten zu erhalten
|
||||||
* Reiseplanung reise = reiseFacade.planeReise(startort, zielort);
|
List<Ort> alleOrte = reiseFacade.ladeAlleOrte();
|
||||||
* System.out.println("Reiseplanung:"); System.out.println("Entfernung: " +
|
Ort zielort = null;
|
||||||
* reise.getEntfernung() + " km"); System.out.println("Reisedauer PKW: " +
|
for (Ort ort : alleOrte) {
|
||||||
* reise.getDauerPKW() + " Stunden"); System.out.println("Reisedauer Fahrrad: "
|
if (ort.getPLZ() == zielPlz && ort.getName().equalsIgnoreCase(zielOrtName)) {
|
||||||
* + reise.getDauerFahrrad() + " Stunden");
|
zielort = ort;
|
||||||
* System.out.println("CO2-Ausstoß PKW: " + reise.berechneCO2Ausstoss() + " g");
|
break;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zielort != null) {
|
||||||
|
System.out.println(reiseFacade.getReiseplanung(user, zielort));
|
||||||
|
} else {
|
||||||
|
System.out.println("Der Zielort wurde nicht gefunden.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void kurztripEmpfehlen() {
|
private void kurztripEmpfehlen() {
|
||||||
if (user != null && user.getHeimatstandort() != null) {
|
if (user != null && user.getHeimatstandort() != null) {
|
||||||
System.out.println("Empfehlung basiert auf Heimatort: " + user.getHeimatstandort().getOrtName());
|
System.out.println("Empfehlung basiert auf Heimatort: " + user.getHeimatstandort().getName());
|
||||||
|
|
||||||
reiseFacade.setHeimatortFromUser(user);
|
reiseFacade.setHeimatortFromUser(user);
|
||||||
|
|
||||||
System.out.print("Wählen Sie ein Transportmittel (Fahrrad/Auto): ");
|
System.out.print("Wählen Sie ein Transportmittel (Fahrrad/Auto): ");
|
||||||
String transportmittel = scanner.nextLine().trim().toLowerCase();
|
String transportmittel = scanner.nextLine().trim().toLowerCase();
|
||||||
|
|
||||||
|
List<Ort> empfohleneOrte = null;
|
||||||
switch (transportmittel) {
|
switch (transportmittel) {
|
||||||
case "fahrrad":
|
case "fahrrad":
|
||||||
List<Ort> fahrradOrte = reiseFacade.zufallsorteFahrrad(10000);
|
empfohleneOrte = reiseFacade.zufallsorteFahrrad(10000);
|
||||||
if (fahrradOrte.isEmpty()) {
|
//List<Ort> fahrradOrte = reiseFacade.zufallsorteFahrrad(10000);
|
||||||
|
/*if (fahrradOrte.isEmpty()) {
|
||||||
System.out.println("Keine Orte innerhalb von 100 km gefunden.");
|
System.out.println("Keine Orte innerhalb von 100 km gefunden.");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("Folgende Orte wurden für einen Fahrrad-Kurztrip empfohlen:");
|
System.out.println("Folgende Orte wurden für einen Fahrrad-Kurztrip empfohlen:");
|
||||||
for (Ort ort : fahrradOrte) {
|
for (Ort ort : fahrradOrte) {
|
||||||
System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")");
|
System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")");
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
break;
|
break;
|
||||||
case "auto":
|
case "auto":
|
||||||
List<Ort> autoOrte = reiseFacade.zufallsortePKW(150);
|
empfohleneOrte = reiseFacade.zufallsortePKW(150);
|
||||||
if (autoOrte.isEmpty()) {
|
//List<Ort> autoOrte = reiseFacade.zufallsortePKW(150);
|
||||||
|
/*if (autoOrte.isEmpty()) {
|
||||||
System.out.println("Keine Orte mindestens 150 km entfernt gefunden.");
|
System.out.println("Keine Orte mindestens 150 km entfernt gefunden.");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("Folgende Orte wurden für einen Auto-Kurztrip empfohlen:");
|
System.out.println("Folgende Orte wurden für einen Auto-Kurztrip empfohlen:");
|
||||||
for (Ort ort : autoOrte) {
|
for (Ort ort : autoOrte) {
|
||||||
System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")");
|
System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")");
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
System.out.println("Ungültige Option. Bitte wählen Sie entweder 'Fahrrad' oder 'Auto'.");
|
System.out.println("Ungültige Option. Bitte wählen Sie entweder 'Fahrrad' oder 'Auto'.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!empfohleneOrte.isEmpty()) {
|
||||||
|
System.out.println("Empfohlene Orte:");
|
||||||
|
KurztripEmpfehlung kurztripEmpfehlung = new KurztripEmpfehlung();
|
||||||
|
for (Ort ort : empfohleneOrte) {
|
||||||
|
double entfernung = kurztripEmpfehlung.berechneEntfernung(user.getHeimatstandort(), ort);
|
||||||
|
System.out.printf("- %s (PLZ: %d, Entfernung: %.1f km)%n", ort.getName(), ort.getPLZ(), entfernung);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.out.println("Keine Orte gefunden.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
System.out.println("Bitte zuerst einloggen und Heimatort angeben!");
|
System.out.println("Bitte zuerst einloggen und Heimatort angeben!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
new UserInterface();
|
new UserInterface();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
package domain;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ReiseplanungTest {
|
||||||
|
|
||||||
|
private Auto auto;
|
||||||
|
private Ort startOrt;
|
||||||
|
private Ort zielOrt;
|
||||||
|
private User user;
|
||||||
|
private Reiseplanung reiseplanung;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
auto = new Auto("Brummi", 167.6); // CO2-Ausstoß in g/km
|
||||||
|
startOrt = new Ort(1067, "Dresden", 13.7210676148814, 51.0600336463379);
|
||||||
|
user = new User("Karl", "hallo", startOrt, auto, 70, 15); // Durchschnittsgeschwindigkeit PKW und Fahrrad
|
||||||
|
zielOrt = new Ort(1705, "Freital", 13.6382950999229, 50.9981963286759);
|
||||||
|
reiseplanung = new Reiseplanung(user, zielOrt);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBerechneEntfernung() {
|
||||||
|
double result = reiseplanung.berechneEntfernung(startOrt, zielOrt);
|
||||||
|
// This value needs to be verified and adjusted if necessary
|
||||||
|
assertEquals(14.2125, result, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBerechneDauer() {
|
||||||
|
double entfernung = 136.5;
|
||||||
|
double geschwindigkeit = 70; // Durchschnittsgeschwindigkeit in km/h
|
||||||
|
double result = reiseplanung.berechneDauer(geschwindigkeit);
|
||||||
|
assertEquals(1.95, result, 0.01);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBerechneCO2Ausstoß() {
|
||||||
|
double entfernung = 73.8;
|
||||||
|
double result = reiseplanung.berechneCO2Ausstoß(auto);
|
||||||
|
assertEquals(12368.88, result, 0.01);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetEntfernung() {
|
||||||
|
assertEquals(14.2125, reiseplanung.getEntfernung(), 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetDauerPKW() {
|
||||||
|
double geschwindigkeit = user.getDurchschnittsgeschwindigkeitPKW();
|
||||||
|
double erwarteteDauer = 14.2125 / geschwindigkeit;
|
||||||
|
assertEquals(erwarteteDauer, reiseplanung.getDauerPKW(), 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetDauerFahrrad() {
|
||||||
|
double geschwindigkeit = user.getDurchschnittsgeschwindigkeitFahrrad();
|
||||||
|
double erwarteteDauer = 14.2125 / geschwindigkeit;
|
||||||
|
assertEquals(erwarteteDauer, reiseplanung.getDauerFahrrad(), 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetCO2Ausstoß() {
|
||||||
|
double erwarteterCO2Ausstoß = 14.2125 * auto.getCO2AusstossProKm();
|
||||||
|
assertEquals(erwarteterCO2Ausstoß, reiseplanung.getCO2Ausstoß(), 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToString() {
|
||||||
|
String expected = "Von " + startOrt.getName() + " Nach " + zielOrt.getName() +
|
||||||
|
"\nEntfernung: " + reiseplanung.getEntfernung() +
|
||||||
|
"\nReisedauer mit dem PKW: " + reiseplanung.getDauerPKW() +
|
||||||
|
"\nReisedauer mit dem Fahrrad: " + reiseplanung.getDauerFahrrad() +
|
||||||
|
"\nCO2-Ausstoß durch PKW: " + reiseplanung.getCO2Ausstoß();
|
||||||
|
assertEquals(expected, reiseplanung.toString());
|
||||||
|
}
|
||||||
|
}
|
|
@ -64,7 +64,7 @@ public class UserTest {
|
||||||
assertTrue(testUser.einloggen());
|
assertTrue(testUser.einloggen());
|
||||||
|
|
||||||
// Überprüfe, ob die Userdaten korrekt gesetzt wurden
|
// Überprüfe, ob die Userdaten korrekt gesetzt wurden
|
||||||
assertEquals("Teststadt", testUser.getHeimatstandort().getOrtName());
|
assertEquals("Teststadt", testUser.getHeimatstandort().getName());
|
||||||
assertEquals("Testauto", testUser.getAuto().getName());
|
assertEquals("Testauto", testUser.getAuto().getName());
|
||||||
assertEquals(0.12, testUser.getAuto().getCO2AusstossProKm(), 0.001); // Delta für Genauigkeit
|
assertEquals(0.12, testUser.getAuto().getCO2AusstossProKm(), 0.001); // Delta für Genauigkeit
|
||||||
assertEquals(80.0, testUser.getDurchschnittsgeschwindigkeitPKW(), 0.001); // Delta für Genauigkeit
|
assertEquals(80.0, testUser.getDurchschnittsgeschwindigkeitPKW(), 0.001); // Delta für Genauigkeit
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
dana,a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3,67105,Schifferstadt,audi,123.0,60.0,30.0
|
max,5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5,10115,Berlin,VW,120.0,60.0,20.0
|
||||||
max,a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3,555,berlin,audi,12.0,23.0,34.0
|
lisa,0ffe1abd1a08215353c233d6e009613e95eec4253832a761af28ff37ac5a150c,80331,Münnchen,auto,120.0,60.0,30.0
|
||||||
tina,a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3,1328,Dresden,audi,12.0,34.0,56.0
|
anna,9b8769a4a742959a2d0298c36fb70623f2dfacda8436237df08d8dfd5b37374c,76131,Karlsruhe,auto1,110.0,60.0,20.0
|
||||||
|
mike,20f3765880a5c269b747e1e906054a4b4a3a991259f1e16b5dde4742cec2319a,68159,Mannheim,auti2,130.0,50.0,20.0
|
||||||
|
sven,e0bc60c82713f64ef8a57c0c40d02ce24fd0141d5cc3086259c19b1e62a62bea,69115,Heidelberg,auto3,120.0,60.0,30.0
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue