From 1746ad7bb1abee511a3f720bbf880f2acb8a7790 Mon Sep 17 00:00:00 2001 From: danai Date: Mon, 17 Jun 2024 12:48:17 +0200 Subject: [PATCH] =?UTF-8?q?Tests=20f=C3=BCr=20KurztripEmpfehlung=20Klasse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/domain/KurztripEmpfehlung.java | 140 ++++++++++++++++++ .../domainTest/KurztripEmpfehlungTest.java | 55 +++++++ 2 files changed, 195 insertions(+) create mode 100644 TravelBuddyApp/src/test/java/domainTest/KurztripEmpfehlungTest.java diff --git a/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java b/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java index 6dc8f7f..a741bb7 100644 --- a/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java +++ b/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java @@ -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 alleOrte; + private Ort heimatort; + + public KurztripEmpfehlung() { + this.alleOrte = ladeAlleOrte(); + this.heimatort = null; + } + + public void setHeimatort(Ort heimatort) { + this.heimatort = heimatort; + } + + + + public List zufallsorteFahrrad(int maxEntfernung) { + List 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 zufallsortePKW(int minEntfernung) { + List 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 zufallsorteAuswaehlen(List orte, int anzahl) { + List 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 ladeAlleOrte() { + List 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; + } } diff --git a/TravelBuddyApp/src/test/java/domainTest/KurztripEmpfehlungTest.java b/TravelBuddyApp/src/test/java/domainTest/KurztripEmpfehlungTest.java new file mode 100644 index 0000000..80701c9 --- /dev/null +++ b/TravelBuddyApp/src/test/java/domainTest/KurztripEmpfehlungTest.java @@ -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 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 orte = empfehlung.zufallsortePKW(150); + assertFalse(orte.isEmpty()); + assertTrue(orte.size() <= 3); + for (Ort ort : orte) { + assertTrue(empfehlung.berechneEntfernung(berlin, ort) >= 150); + } + } +}