Tests für KurztripEmpfehlung Klasse
parent
a17d823f7b
commit
1746ad7bb1
|
@ -1,5 +1,145 @@
|
|||
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 {
|
||||
|
||||
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