Tests für KurztripEmpfehlung Klasse
parent
a17d823f7b
commit
1746ad7bb1
|
@ -1,5 +1,145 @@
|
||||||
package domain;
|
package domain;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
public class KurztripEmpfehlung {
|
public class KurztripEmpfehlung {
|
||||||
|
|
||||||
|
private List<Ort> alleOrte;
|
||||||
|
private Ort heimatort;
|
||||||
|
|
||||||
|
public KurztripEmpfehlung() {
|
||||||
|
this.alleOrte = ladeAlleOrte();
|
||||||
|
this.heimatort = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeimatort(Ort heimatort) {
|
||||||
|
this.heimatort = heimatort;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public List<Ort> zufallsorteFahrrad(int maxEntfernung) {
|
||||||
|
List<Ort> gefilterteOrte = new ArrayList<>();
|
||||||
|
|
||||||
|
if (heimatort == null) {
|
||||||
|
System.out.println("Heimatort ist nicht gesetzt.");
|
||||||
|
return gefilterteOrte;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Ort ort : alleOrte) {
|
||||||
|
double entfernung = berechneEntfernung(heimatort, ort);
|
||||||
|
if (entfernung <= maxEntfernung) {
|
||||||
|
gefilterteOrte.add(ort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gefilterteOrte.isEmpty()) {
|
||||||
|
System.out.println("Keine Orte innerhalb der Entfernung von " + maxEntfernung + " km gefunden.");
|
||||||
|
return gefilterteOrte;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public List<Ort> zufallsortePKW(int minEntfernung) {
|
||||||
|
List<Ort> gefilterteOrte = new ArrayList<>();
|
||||||
|
|
||||||
|
if (heimatort == null) {
|
||||||
|
System.out.println("Heimatort ist nicht gesetzt.");
|
||||||
|
return gefilterteOrte;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Ort ort : alleOrte) {
|
||||||
|
double entfernung = berechneEntfernung(heimatort, ort);
|
||||||
|
if (entfernung >= minEntfernung) {
|
||||||
|
gefilterteOrte.add(ort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gefilterteOrte.isEmpty()) {
|
||||||
|
System.out.println("Keine Orte mindestens " + minEntfernung + " km entfernt gefunden.");
|
||||||
|
return gefilterteOrte;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Ort> zufallsorteAuswaehlen(List<Ort> orte, int anzahl) {
|
||||||
|
List<Ort> zufallsorte = new ArrayList<>();
|
||||||
|
Random random = new Random();
|
||||||
|
|
||||||
|
int size = orte.size();
|
||||||
|
if (size <= 0) {
|
||||||
|
throw new IllegalArgumentException("Die Liste der Orte ist leer oder hat eine ungültige Größe.");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < anzahl; i++) {
|
||||||
|
int index = random.nextInt(size);
|
||||||
|
zufallsorte.add(orte.get(index));
|
||||||
|
orte.remove(index); // Sicherstellen, dass Orte nicht doppelt empfohlen werden
|
||||||
|
size--; // Reduzieren der Größe der Liste nach Entfernen eines Elements
|
||||||
|
}
|
||||||
|
|
||||||
|
return zufallsorte;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double berechneEntfernung(Ort standort, Ort zielort) {
|
||||||
|
double b1 = Math.toRadians(standort.getBreitengrad());
|
||||||
|
double b2 = Math.toRadians(zielort.getBreitengrad());
|
||||||
|
double l1 = Math.toRadians(standort.getLängengrad());
|
||||||
|
double l2 = Math.toRadians(zielort.getLängengrad());
|
||||||
|
|
||||||
|
double deltaL = l2 - l1;
|
||||||
|
double cosDeltaL = Math.cos(deltaL);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private 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, breitengrad, 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 Object getHeimatort() {
|
||||||
|
return heimatort;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
package domainTest;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import domain.KurztripEmpfehlung;
|
||||||
|
import domain.Ort;
|
||||||
|
|
||||||
|
public class KurztripEmpfehlungTest {
|
||||||
|
|
||||||
|
private KurztripEmpfehlung empfehlung;
|
||||||
|
private Ort berlin;
|
||||||
|
private Ort dresden;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
empfehlung = new KurztripEmpfehlung();
|
||||||
|
berlin = new Ort(10115, "Berlin", 52.5200, 13.4050);
|
||||||
|
dresden = new Ort(1067, "Dresden", 51.0600336463379, 13.7210676148814);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetHeimatort() {
|
||||||
|
empfehlung.setHeimatort(berlin);
|
||||||
|
assertEquals(berlin, empfehlung.getHeimatort());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testZufallsorteFahrrad() {
|
||||||
|
empfehlung.setHeimatort(berlin);
|
||||||
|
List<Ort> orte = empfehlung.zufallsorteFahrrad(100);
|
||||||
|
assertFalse(orte.isEmpty());
|
||||||
|
assertTrue(orte.size() <= 3);
|
||||||
|
for (Ort ort : orte) {
|
||||||
|
assertTrue(empfehlung.berechneEntfernung(berlin, ort) <= 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testZufallsortePKW() {
|
||||||
|
empfehlung.setHeimatort(berlin);
|
||||||
|
List<Ort> orte = empfehlung.zufallsortePKW(150);
|
||||||
|
assertFalse(orte.isEmpty());
|
||||||
|
assertTrue(orte.size() <= 3);
|
||||||
|
for (Ort ort : orte) {
|
||||||
|
assertTrue(empfehlung.berechneEntfernung(berlin, ort) >= 150);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue