Liste in pseudo geordnete Reihenfolge bringen

harte-nuss

Neues Mitglied
Hi. Ich habe eine Liste, in der IP-Adresse aufsteigend sortiert sind. Zwei IP-Adressen können ähnliche GPS haben. Wie entscheide ich dann bei Duplikaten, welche IP-Adresse behalten werden soll, sodass nicht immer nur die kleinste oder größte IP des gleichen GPS erhalten bleibt? Das Resultat sollte jedoch auch replizierbar sein, das heißt, wenn in einem Intervall neue und gleiche IPs hinzukommen, dann soll das Resultat auch das gleiche sein.

Beispiel:

Java:
    TreeMap<Point2D, String[]> database = new TreeMap<>(Comparator.comparingDouble(Point2D::getX).thenComparingDouble(Point2D::getY));
    //...
    double minDistance = 0.01; // approx ~1km
    for (Point2D p1 : new LinkedList<>(database.keySet())) {
      for (Point2D p2 : new LinkedList<>(database.keySet())) {
        if (p1.equals(p2)) {
          continue;
        }
        if (p1.distance(p2) < minDistance) {
          // Was hier tun?
          //database.remove(p2);
          //System.out.println("Removed duplicate GPS entry at " + p2 + " with distance " + p1.distance(p2));
        }
      }
    }
 

KonradN

Super-Moderator
Mitarbeiter
Ich fürchte, Du hast bisher noch nicht wirklich beschrieben, was genau Du haben willst. Vermutlich erklärt das auch Dein Problem, hier irgend welchen sinnvollen Code abzuliefern. Du musst also wirklich die Problemdomain sorgfältig beschreiben und darauf basierend dann die notwendige Businesslogik beschreiben.

Wenn Du etwas beschreibst, dann muss es auch dem Code entsprechen - "Ich habe eine Liste" und dann eine TreeMap<Point2D, String[]> passt nicht wirklich.

Vermutlich kommt daher dann auch so ein erster Ansatz, der relativ an den Haaren herbei gezogen ist. Wie kommst Du auf zwei Listen, die Du durchgehst? Und die Listen erstellst Du einmal aus der Map und nimmst dann nur Elemente aus der Map? Du wirst abgearbeitete Elemente also wieder und wieder bearbeiten und erneut prüfen. Dabei willst Du doch unter dem Strich nur eine Liste einmal durchgehen um dann eben die Zielliste zu erstellen. So habe ich zumindest deine grobe Anforderung verstanden.

Also Du hast bisher eine "Liste" von jeweils einer Koordinate und dazu dann ein Array mit IPs. (Aus Deiner TreeMap kannst Du das z.B. über entrySet() bekommen - ist dann zwar ein Set, aber das ist hier jetzt eine umgangssprachliche Ungenauigkeit. Generell wäre aber die Frage: Was bekommst Du wirklich bzw. hast Du genau?

Nun willst Du da weitere Gruppierungen vornehmen - über den Abstand und das Resultat soll immer gleich sein? Halte ich für so nicht möglich:
Nehmen wir drei Punkte, die annähernd auf einer Geraden Strecke liegen: A-B-C - die Abstände von A,B und B,C sind kleiner als dein minimaler Abstand, A,C ist aber größer. Nun hängt es von der Reihenfolge ab, wie das Ergebnis erfasst wird:
Kommt B zuerst, dann wird festgestellt: A liegt dichter dran -> Kommt zu B, C liegt dichter dran -> kommt zu B. Du hast also B mit IPs von A,B und C
Kommt A zuerst, dann wirst Du A mit Werten von A und B haben und C mit dem Wert von C.
Kommt C zuerst, dann wirst Du C mit den Werten von C und B haben und A mit dem Wert von A.

Hier müsste man also entweder akzeptieren, dass es eben abhängig von der Reihenfolge der Punkte ist, was als Ergebnis heraus kommt. (Wenn Du nur einmal eine Liste hast und diese sortiert ist, dann hättest Du bei jedem durchlauf natürlich immer das gleiche Ergebnis), oder Du müsstest Dir hier genauer überlegen, was die Anforderung ist und wie Du diese erfüllen könntest.

Wenn man dann so einen Algorithmus entwickeln will, dann sollte man diesen im Detail aufschreiben. Und zwar so genau, dass klar ist, was gemacht werden muss. Dabei wird idealer Weise auch direkt der Algorithmus in viele einzelne unterteilt.

Also hier wäre das etwas wie:

Für jedes Element aus Koordinate und Liste an IPs:
- Füge dieses Element in der Zielstruktur ein.

Einfügen von Koordinate Kneu / IPs in die Zielstruktur wäre dann:
- finde das erste Element für das gilt Abstand von Knew zu Kelem < minDistance
-- Wenn so ein Element gefunden wurde, dann füge die IPs vom neuen Element diesen IPs des bisherigen Elements hinzu
-- Wenn so ein Element nicht gefunden wurde, dann füge Kneu mit den IPs in der Zielstruktur hinzu.

Einfügen von IPs in eine vorhandene Struktur von IPs
Das wäre dann auch noch zu beschreiben ...

Sowas lässt sich dann relativ einfach und strukturiert entwickeln. Was wir jetzt aber nur betrachtet haben ist der reine logische Ablauf. Wir sollten aber hier auf sinnvolle Datenkonstrukte zurück greifen. Java ist eine objektorientierte Sprache und es bietet sich an, sowas auch zu verwenden. Daher würde ich für die "Zielstruktur" eine eigene Klasse schreiben. Datenklassen sollten die Daten sauber umfassen, also z.B. die Koordinate zusammen mit den IP Adressen ... Die IP Adressen könnte man auch in einer eigenen Struktur umfassen um da die Logik sauber zu kapseln...Aber das hängt davon ab, was Du da brauchst. Evtl. reicht es, hier einfach ein Set<String> zu haben, da dieses bereits alle Logik enthält, die man braucht.

Die Kernidee einer solchen Implementation ist dann also, dass Du eine Klasse hast, die die Daten entsprechend vorhält. Wenn neue Datensätze hinzukommen, dann werden diese entsprechend hinzugefügt. Intern mag das dann eine TreeMap sein, aber das ist erst einmal egal. Das ist ein internes Implementationsmerkmal, das nicht nach aussen geht.
 

Oneixee5

Top Contributor
Das klingt wie die Implementierung einer sogenannten Bounding Box (Begrenzungsrahmen). Da du nur an den Extremwerten interessiert bist, musst du nicht alle Punkte speichern, sondern nur vier Werte aktualisieren, sobald ein neuer Punkt hinzugefügt wird.
Java:
import java.awt.geom.Point2D;

public class PointBounds {
    private double minX = Double.MAX_VALUE;
    private double minY = Double.MAX_VALUE;
    private double maxX = -Double.MAX_VALUE;
    private double maxY = -Double.MAX_VALUE;
    private boolean isEmpty = true;

    /**
     * Fügt einen neuen Punkt hinzu und aktualisiert die Min/Max-Werte.
     */
    public void add(Point2D point) {
        if (point == null) return;

        double x = point.getX();
        double y = point.getY();

        minX = Math.min(minX, x);
        minY = Math.min(minY, y);
        maxX = Math.max(maxX, x);
        maxY = Math.max(maxY, y);
        
        isEmpty = false;
    }

    // Getters
    public double getMinX() { return isEmpty ? 0 : minX; }
    public double getMinY() { return isEmpty ? 0 : minY; }
    public double getMaxX() { return isEmpty ? 0 : maxX; }
    public double getMaxY() { return isEmpty ? 0 : maxY; }

    @Override
    public String toString() {
        if (isEmpty) return "Bounds: empty";
        return String.format("Bounds: [MinX: %.2f, MinY: %.2f] to [MaxX: %.2f, MaxY: %.2f]",
                              minX, minY, maxX, maxY);
    }
}
 

KonradN

Super-Moderator
Mitarbeiter
Bounding Box (Begrenzungsrahmen).

Ich glaube, Du hast bei den Math.min/Math.max Aufrufen in dem gegebenen Code vergessen, x bzw y zu verändern. Du willst da ja nicht x und y speichern sondern jeweils +/- einer bestimmten Boxgröße.

Aber muss man die Box so genau definieren? Durch den Abstand hat man sowas ja bereits prinzipiell (dann nur eben nicht als box sondern als ein Kreis um einen Punkt).
 

Oneixee5

Top Contributor
Ich glaube, Du hast bei den Math.min/Math.max Aufrufen in dem gegebenen Code vergessen, x bzw y zu verändern. Du willst da ja nicht x und y speichern sondern jeweils +/- einer bestimmten Boxgröße.

Aber muss man die Box so genau definieren? Durch den Abstand hat man sowas ja bereits prinzipiell (dann nur eben nicht als box sondern als ein Kreis um einen Punkt).
Ich denke nicht, GPS-Koordinaten sind absolut, nicht +/-. Man kann also genau herausfinden, ob eine IP in einem bestimmten Umfeld liegt oder nicht.
 

Oneixee5

Top Contributor
Zu den IP's selbst: Wenn man die kleinste oder größte IP wählt, erzeugt man einen Bias (systematische Bevorzugung). Um das zu vermeiden und gleichzeitig ein gleiches Ergebnis bei gleichen Daten zu garantieren, ist Hashing die beste Lösung. Anstatt min(IP) zu nehmen, nimmt man die IP, mit dem Hash der am kleinsten ist. Da der Hash-Wert einer IP immer gleich bleibt, ist das Ergebnis wiederholbar. Da Hash-Werte aber nichts mit der numerischen Größe der IP zu tun haben, verhinderst man den Bias für kleine/große IPs.
Wenn man eine neue IP zum Cluster hinzugefügt, wird diese nur dann der neue Gewinner/Endwert, wenn der Hash noch kleiner ist als der des bisherigen Gewinners. Der bisherige Gewinner wird niemals gegen eine IP verlieren, gegen die er vorher schon mal gewonnen hat.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
MiMa Filtern von TableView Liste Allgemeine Java-Themen 2
B Liste aller Kombintionen mit Einschränkungen Allgemeine Java-Themen 8
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
bueseb84 Spring Boot Entity mit Liste Allgemeine Java-Themen 4
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
K verkettete Liste Allgemeine Java-Themen 3
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
T Google Links in einer Liste Allgemeine Java-Themen 4
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
L Liste überschreibt alte Elemte Allgemeine Java-Themen 10
H Länge einer verketteten Liste Allgemeine Java-Themen 4
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
B Wie vergleiche ich Strings in einer Liste? Allgemeine Java-Themen 5
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
Z In die Liste kann ich nichts adden Allgemeine Java-Themen 16
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
M liste von listen anders ausgeben Allgemeine Java-Themen 1
B Per Buttonklicks einer Liste Wörter hinzufügen - Wie umsetzen? Allgemeine Java-Themen 11
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
D Liste anhand Standardnormalverteilung befüllen Allgemeine Java-Themen 1
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
M Werte aus DB in Liste speichern ohne mehrfach speicherung Allgemeine Java-Themen 18
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
O aus Liste ein beliebiges Element auswählen Allgemeine Java-Themen 7
J Liste aller Com-Ports - zweistellige Ports? Allgemeine Java-Themen 15
O MVC - wo Liste der ComboBox-Items ermitteln Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
K kontinuierlich aktuelle Bestellsystem-Liste mit farbigem Status Allgemeine Java-Themen 2
A Auswählbare Liste Allgemeine Java-Themen 2
D Sortieren von Liste zu unperformant Allgemeine Java-Themen 6
N Liste gesucht Allgemeine Java-Themen 2
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8
O JSON String bauen aus Liste Allgemeine Java-Themen 2
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
S Threads Liste mit Objekten in Teillisten zerlegen und abarbeiten Allgemeine Java-Themen 3
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
pg1337 Liste füllen Allgemeine Java-Themen 2
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
B Properties File Liste Allgemeine Java-Themen 3
Gossi Collections Liste zusammenfassen für JSP Allgemeine Java-Themen 4
Gossi Collections (Unbekannte) Liste Sortieren Allgemeine Java-Themen 10
T Collections Liste schnell/nebenläufig durchgehen Allgemeine Java-Themen 2
M Objekt aus Liste in Liste suchen/löschen Allgemeine Java-Themen 6
Q "Doppelte" Einträge einer Liste entfernen Allgemeine Java-Themen 14
C Exponentielle Verteilung in einer Liste Allgemeine Java-Themen 7
Nic.o liste der installierten Zertifikate ?! Allgemeine Java-Themen 3
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
M Verständnisfragen bezüglich Liste Allgemeine Java-Themen 3
S AWT Wie bekomme ich eine Liste aller chars in einem Font? Allgemeine Java-Themen 3
J Zeichenketten-Liste filtern Allgemeine Java-Themen 6
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
K Liste aller implementierenden Klassen einer Oberklasse anzeigen Allgemeine Java-Themen 4
M Eintrag verschwindet aus Liste Allgemeine Java-Themen 3
E Objekte in einer Liste suchen. Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
reibi Kopie einer Liste Allgemeine Java-Themen 4
N Liste mit Map abgleichen extrem langsam Allgemeine Java-Themen 6
C Darstellung der Liste bei vielen Daten extrem langsam Allgemeine Java-Themen 11
T Liste sortieren Allgemeine Java-Themen 6
L Objekte in Liste packen Allgemeine Java-Themen 2
N Liste aendern waehrend des iterierens ueber selbige Allgemeine Java-Themen 11
B Datenstruktur: Liste Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben