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.