Eindeutige ID für Objekte als Keys in TreeMap

Status
Nicht offen für weitere Antworten.

JanHH

Top Contributor
Hallo,

ich will Objekte mit einer TreeMap mappen. Dabei wird einem Objekt von KlasseA jeweils ein Objekt von KlasseB zugewiesen. Damit das funktioniert, muss KlasseA bekanntlich das Interface Comparable implementieren. Die Instanzen von KlasseA sind allerdings nun nicht inhaltlich sinnvoll vergleichbar, daher muss irgendwas künstliches her, was möglichst wenig Aufwand macht. Also einfach irgndetwas eindeutiges, vergleichbares, was ein Objekt so besitzt. Jedr Instanz von KlasseA eine künstliche, eindeutige ID mitzugeben, ist mir eigentlich zu aufwändig.

Was kann man denn da sonst noch machen?

Erste Idee: Speicheradresse nehmen. Ich habe allerdings bisher keine Funktion "getMemoryAdress" oder so etwas gefunden

Hashcode. Ist sicherlich praktikabel, da der HashCode eines Objektes *in der Regel* der Speicheradresse entspricht, und *in der gegenwärtigen Implementierung* aus praktikablen Gründe zwei verschiedene Objekte auch immer zwei verschiedene Hashcodes bekommen. Würde also funktionieren, ist aber nicht sicher, weil die erwähnten Vorraussetzungen nicht zugesichert sind.

Ansonsten bleibt wohl nur, selber irgendeine Lösung bauen. Könnte mir z.B. einen Applikationsweiten UniqueRandomGenerator vorstellen, der Zufallszahlen erzeugt, die sich nicht wiederholen. Aber das ist mir eigentlich zu aufwändig, wenn es auch eine einfachere Lösung gibt.

Fürs erste werde ich mal die Hashcode-Variante probieren..

Jemand eine Idee?

Gruß+Danke
Jan
 
S

SlaterB

Gast
was ist denn daran aufwendig? die Ids müssen nicht mal zufällig sein, ein long-Wert 1.. unendlich reicht

statische Variable, die bei 1 anfängt, Zugriff nur über synchronisierte Methode, das könnte in eine separate Generator-Klasse,

in den Objektklassen brauchst du sowieo ein Attribut + vielleicht ein getter, um die id zu speichern, also

private long id;
public long getId() {
if (id == 0) {
id = Generator.createId(); // bei Bedarf hier wie dort synchronized
}
return id;
}


edit:
> und *in der gegenwärtigen Implementierung* aus praktikablen Gründe zwei verschiedene Objekte auch immer zwei verschiedene Hashcodes bekommen.

kann man nur Integer.Max_VALUE viele Objekte erstellen?
ok, vom Arbeitsspeicher her bestimmt nicht so gut zu testen ;)
aber spätestens wenn man die Objekte mit Id in eine Datei schreibt..

irgendwann ist natürlich immer Schluss, auch bei long, dann gehts mit String/ BigInteger weiter :)
 
Zuletzt bearbeitet von einem Moderator:

0x7F800000

Top Contributor
"Die Instanzen von KlasseA sind allerdings nun nicht inhaltlich sinnvoll vergleichbar"
...aber du willst dennoch aus irgendeinem Grund eine TreeMap einsetzen.
Knick in der Logik...? :autsch:
 

FArt

Top Contributor
1. Hier kriegt man einfach eine ID her: UUID (Java 2 Platform SE 5.0)
2. Was meinst du mit "zuweisen" und wozu dann "Comparable"?
3. Der Hashcode entspricht der Speicheradresse? Was ist denn das für ein Käse. Der Hashcode ist ein Hash über den relevanten Inhalt einer Objektinstanz und nicht eindeutig.
4. Wenn die Objekte nicht sinnvoll vergleichbar sind, warum steckst du sie dann in eine sortierte Datenstrutkur?
 

JanHH

Top Contributor
Das mit hash-Code=Speicheraddresse habe ich irgendwo gelesen. Die online-java-Doku selber sagt, dass praktikablerweise zwei verschiedene Objekte in der Regel auch verschiedene hash-Codes haben.

Die Frage nach dem "warum".. ich habe halt Paare von Objekten, die zueinander in Bezug stehen. Ich bekomme irgendwoher Objekt A, und brauche das "dazugehörige" Objekt B. Allerdings sind diese Objekte inhaltlich sonst in keiner Weise miteinander verwandt, es ist nicht sinnvoll, das eine als Member des anderen zu organisieren.

Naja und zum mappen derartiger Dinge gibt es ja die Maps in java, nicht wahr ;). Ob die sortiert sind oder nicht, ist ja egal.. es geht eher um schnellen Zugriff.

Aber vielleicht stellt einfach das verwenden einer HashMap die Lösung dar? Diese ist ja nicht "natürlich sortiert", und wenn ich das richtig sehe, braucht man da keine Comparable-Objekte?

Ansonsten ist die Lösung mit dem "Generator", also einem Applikationsweiten, statischen Zähler, vermutlich die Beste. Bin da mittlerweile auch drauf gekommen.

Danke für die Antworten.
 

0x7F800000

Top Contributor
Die Frage nach dem "warum".. ich habe halt Paare von Objekten, die zueinander in Bezug stehen. Ich bekomme irgendwoher Objekt A, und brauche das "dazugehörige" Objekt B. Allerdings sind diese Objekte inhaltlich sonst in keiner Weise miteinander verwandt, es ist nicht sinnvoll, das eine als Member des anderen zu organisieren.

Naja und zum mappen derartiger Dinge gibt es ja die Maps in java, nicht wahr ;).
ja, genau.

Ob die sortiert sind oder nicht, ist ja egal..
nein, ist es nicht.
es geht eher um schnellen Zugriff.
Dann brauchst du natürlich HashMap mit O(1) statt SortedMap mit O(lg(n))

Aber vielleicht stellt einfach das verwenden einer HashMap die Lösung dar?
sieht ganz danach aus.
Diese ist ja nicht "natürlich sortiert"
Nein. und die reihenfolge in der man das einfügt spielt auch keine rolle, da wird alles durcheinandergeworfen.
und wenn ich das richtig sehe, braucht man da keine Comparable-Objekte?
dort muss man aber vorsichtig und mit bedacht die equals-methode und die hashCode-methode implementieren, sodass sie den vorgeschriebenen vertrag erfüllen:
"a equals b => hash(a)==hash(b)"

Ansonsten ist die Lösung mit dem "Generator", also einem Applikationsweiten, statischen Zähler, vermutlich die Beste. Bin da mittlerweile auch drauf gekommen.
Wenn es so ist, dann brauchst du wohl nichtmal die equals bzw hashCode zu überschreiben. Dann testest du nur noch auf ==. Da musst du dir aber wirklich sicher sein, dass alle objekte "inhaltliche unikate" sind (was imho selten brauchbar ist... ???:L)
 

JanHH

Top Contributor
Also SO wichtig ist Geschwindigkeit nun auch nicht.. ich muss die im Grunde nur irgendwie einander Zuordnen können. Im Grunde könnte ich es auch komplett selber programmieren.. dau eine Klasse "TwoObjects", die zwei Objekte aufnimmt, und eine Liste solcher Objekte, und damit dann die Zuordnungen realisieren. Da muss dann halt zum wiederfinden jeweils die ganze Liste komplett durchsucht werden, das könnte im allerschlimmsten realen Anwendungsfall zu 100 Mal durchsuchen einer Liste mit 100 Einträgen führen. Aber sogar das wäre wohl noch brauchbar. Aber Tree oder HashMap sind da natürlich effizienter.

Elegant war bei Smalltalk die Dictionary-Klasse, wo man einfach beliebige Objekte als Keys für beliebige andere Objekte verwenden konnte.. aber dem kommt die HashMap wohl relativ nahe.
 
S

SlaterB

Gast
solange jedes Objekt unique ist und du wirklich mit denselben Objekt A suchst statt einem gleichen Objekt A,
geht die ganz normale HashMap ohne überschriebene equals/ hashCode-Methode (in A)

wenn du jetzt schon überlegtest, in A eine Id hinzuzufügen,
kannst du dann nicht auch gleich setB() getB() einbauen? ;)
 
G

Gelöschtes Mitglied 5909

Gast
[highlight=java]
public class SequenceGenerator {

private AtomicLong atomicLong = new AtomicLong(0);

public long getId() {
return atomicLong.incrementAndGet();
}

}
[/highlight]
 

JanHH

Top Contributor
Das Atomic-Dings, danke für den Hinweis, kommt mir ehrlich gesagt etwas albern vor.. so, als wolle sun in den java-Bibliothkenen wirklich alles abnehmen und jede noch so banale Funktionalität schon vorgefertigt bereitstellen.

Mein Programm hat zwei Einsatzzwecke.. für einen von beiden würde B als Member von A gut funktionieren (in der Tat war es bis vor kurzem auch ziemlich genau so), bei dem anderen gibt es keine Objekte vom Typ B, die gesamte Mapping-Sache fällt weg, und der Einsatzzweck ist auch noch deutlich speicherkritischer. Daher besser nicht so eine Lösung (ausserdem brauche ich das ab und an auch umgekehrt, A als Member von B, und das geht gar nicht, weil es sich bei B um Swing-Komponenten handelt, wo ich nicht so ohne weiteres member hinzufügen kann/will).

Naja. Aber mit der HashMap läufts ja nun auch scheinbar ganz gut.

Danke
Jan
 

0x7F800000

Top Contributor
Das Atomic-Dings, danke für den Hinweis, kommt mir ehrlich gesagt etwas albern vor.. so, als wolle sun in den java-Bibliothkenen wirklich alles abnehmen und jede noch so banale Funktionalität schon vorgefertigt bereitstellen.
sowas zu synchronisieren ist weniger banal, sondern eher nervig... :noe:
Dass da überall "atomic atomic atomic" dabei steht ist dir bestimmt aufgefallen, oder hast du nur auf diese komische methode geachtet?
 

JanHH

Top Contributor
Ich versteh die Frage grad nicht so ganz.. aber mein eigentliches Problem habe ich gelöst (durch simples verwenden von HashMaps).

Danke
Jan
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E eindeutige Id's für Rechner Allgemeine Java-Themen 7
LimDul Eindeutige ID (ala UUID) generieren als numerisch, maximal 16 Stellen Allgemeine Java-Themen 11
U Nicht eindeutige Dateipfade Allgemeine Java-Themen 7
H Eindeutige ID erzeugen? Allgemeine Java-Themen 15
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
kodela Eingabe für TextArray bedingt sperren Allgemeine Java-Themen 3
Karl_Der_Nette_Anfänger Hat wer ne Lösung für verknüpfte Postleitzahlen? (Baum/Wurzel Struktur) Allgemeine Java-Themen 11
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
G KeyListener für JTextField Allgemeine Java-Themen 5
webracer999 Library für Textsuche (z. B. include/exclude, and/or)? Allgemeine Java-Themen 5
I Module-Info für Jar erzeugen Allgemeine Java-Themen 7
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
B Simpler Eventlistener für Tastaturtaste bauen? Allgemeine Java-Themen 13
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
E Key für TOTP Algorythmus(Google Authentificator) Allgemeine Java-Themen 0
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
rosima26 Bester Sortieralgorithmus für kurze Arrays Allgemeine Java-Themen 40
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
B Lottospiel, genug Reihen tippen für 3 Richtige (Spaß mit Arrays)? Allgemeine Java-Themen 46
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
D Klassendesign für einen Pascal Interpreter Allgemeine Java-Themen 6
I OCR Library für Belegerkennung Allgemeine Java-Themen 7
farah GetterMathod für Farbkanäle Allgemeine Java-Themen 6
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
S Webservices für binäre Daten? Allgemeine Java-Themen 5
G Licence-Header für InHouse entwickelten Source Allgemeine Java-Themen 8
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
F Java Script für das Vorhaben das richtige? Allgemeine Java-Themen 9
M wiviel Java muss ich für die Berufswelt können ? Allgemeine Java-Themen 5
Robertop Datumsformat für GB ab Java 16 Allgemeine Java-Themen 1
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
D SHA-3 für Java-version 1.8 Allgemeine Java-Themen 1
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
Muatasem Hammud Erstellung von Testdaten für Arrays Allgemeine Java-Themen 6
B Logikfehlersuche, das perfekte Lottosystem für 3 Richtige mit Arraylists? Allgemeine Java-Themen 61
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
M API für PLZ Umkreissuche Allgemeine Java-Themen 3
1Spinne JDK 8 für Eclipse installieren Allgemeine Java-Themen 5
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
L Methoden Parser für gängige Datumsformate? Allgemeine Java-Themen 1
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
buchfrau Anagram für beliebiges Wort Allgemeine Java-Themen 2
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
Kirby.exe Distanz Map für die Distanztransformation erstellen Allgemeine Java-Themen 1
F PI Regler für Heizung Allgemeine Java-Themen 7
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
B Login für User, der im Hintergrund Schedules ausführt Allgemeine Java-Themen 16
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
S Java-Task-Management-Tool für Windows und Mac selber programmieren Allgemeine Java-Themen 4
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
Z Welches GUI Framework für Java ist aktuell? Allgemeine Java-Themen 16
N Convert.FromBase64 von C# für Java Allgemeine Java-Themen 11
N fixed-keyword von C# für Java Allgemeine Java-Themen 6
O Suche Scripter für alt:V Project! Allgemeine Java-Themen 0
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
O Suche Unterstützung für ein OpenSource-Projekt (grafischer Editor) Allgemeine Java-Themen 13
Kirby.exe Software für Graphische Visualisierung Allgemeine Java-Themen 20
B OOP Auslöser für NullPointerException Allgemeine Java-Themen 3
L Generator für einen Parser implementieren Allgemeine Java-Themen 13
DonMalte Ambitioniertes Projekt für Einsteiger & Motivierte Allgemeine Java-Themen 0
Kirby.exe Movement System für Spiel Allgemeine Java-Themen 13
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
Thallius Rätsel für Windows Profis Allgemeine Java-Themen 8
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
Thallius Alternative für SwingWorker Allgemeine Java-Themen 5
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
H OOP Setting(config) für Applikation sicheren? Allgemeine Java-Themen 9
OnDemand PDF Libary für Formulare Allgemeine Java-Themen 7
S Warmup für Lineare-Suche mit Zeitmessung Allgemeine Java-Themen 2
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
M Brainstorming für mein Projekt Allgemeine Java-Themen 30
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
C Bibliotheken für Algorithmische Geometrie Allgemeine Java-Themen 2
C Daten für Klassifikationsverfahren gewinnen Allgemeine Java-Themen 6
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
I Overlay für Spiele Allgemeine Java-Themen 5
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
I GUI für kleine Pop-Ups unter Windows Allgemeine Java-Themen 1
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
HarleyDavidson Best Practice Wohin mit der Konfigurationsdatei für Desktopapplikationen? Allgemeine Java-Themen 3
R MAC-Adresse eindeutig für einen PC ? Bezug zu Netzwerk, wieso ? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben