Key erzeugen

sinoptik

Mitglied
Hallo Zusammen,

folgendes Problem: Ich muss einen Schlüssel für eine Map generieren, der aus Datum, KundenId und AuftragsId besteht. Bei gleicher Kombination von Datum, Kd.Id und Auftr.Id müssen die Schlüssel gleich sein.
Bisher habe ich folgendes gemacht:
Java:
Long key = dc.getDate().getTime() + dc.getKundenId() * 3 + dc.getAuftragsId() * 2;

Nun habe ich den Fall erlebt, dass zwei verschiedene Kombinationen aus Datum, Kd.Id und Auftr.Id einen gleichen Schlüssel erzeugen, was nicht passieren darf.
Wie kann man das verhindern?

Vielen Dank für Eure Antworten.
 
S

SlaterB

Gast
je nachdem wieviel Stellen die Teilinformationen dezimal oder meinetwegen in bytes haben,
können die ~20 Dezimalstellen oder 64 Bit eines Long vielleicht nicht reichen,
Datum usw. sieht ziemlich übel aus, geht auch ein beliebig langer String als Key?

für ein einfacheres Beispiel mit Key1 = 0-99 und Key2 = 0-9999 wäre die Formel Key1*10000+Key2 denkbar,
hinter Key1 4 Stellen freimachen, so dass jeder Key2 eindeutig hinein passt,

einfach nur wild zusammenaddieren geht nicht, denn 5 + 3 = 3 + 5, ein unbedachter Faktor wie * 2 macht da nicht viel Unterschied,
läßt gerademal ein Bit frei, das reicht nur falls dahinter nur noch ein Bit an Information kommt, ein boolean, 0 oder 1
 

Mike90

Bekanntes Mitglied
Hey,

nutze einfach die hachCode() Methode deines Objektes dc.
Generiere dir den Hash(also den Key für deine Map) dadrüber.
Aber aufgepasst, die equals() Methode dann auch entsprechend überschreiben.

BG
 
S

SlaterB

Gast
hashCode ist ein int, also nur ~10 Decimalstellen, 32 Bit, das ist ja nochmal 50% weniger und die Kollisionswahrscheinlichkeit steigt
(je nach Sichtweise auch um den Faktor 2^32 ~ 99.99..% ;) )

wenn man aber von der einfachen Ähnlichkeit ausgeht (ähnliche Uhrzeit, Ids +-1),
dann ist die Durchmischung einer guten hashCode-Methode aber sicher besser als das bisherige, das stimmt schon
 
N

nillehammer

Gast
Schreib Dir eine Klasse, die die Felder Datum, Kd.Id und Auftr.Id als Members enthält und implementiere hierfür equals() und hashCode(). Dann nutze Instanzen dieser Klasse als key für Deine Map:
[Java]
public final class MapKey {
private final Date date;
private final Long kundenId;
private final Long auftragsId;

public MapKey(final Date date, final Long kundenId, final Long auftragsId) {
this.date = date;
this.kundenId = kundenId;
this.auftragsId = auftragsId;
}

@Override
public final boolean equals(final Obj obj) {
// Hinweis: instanceof nur bei finalen Klassen,
// sonst erst auf null und dann auf Klassenidentität prüfen.
if (!(obj instanceof MapKey)) {
return false;
}
final MapKey that = (MapKey) obj;

// Unbedingt die Hilfklassen aus commons-lang benutzen!
// Alles andere ist zu viel Arbeit und meist auch fehlerbehaftet.
return new EqualsBuilder().append(this.date, that.date).append(this.kundenId, that.kundenId).append(this.auftragsId, that.auftragsId).isEquals();
}

/**
* Unbedingt konsistent mit equals() implementieren. D.h. alle Felder, die bei equals() verglichen
* werden, müssen in die Berechnung des hashCode einfließen.
*/
@Override
public final int hashCode() {
// Unbedingt die Hilfklassen aus commons-lang benutzen!
// Alles andere ist zu viel Arbeit und meist auch fehlerbehaftet.
return new HashCodeBuilder(1,13).append(this.date).append(this.kundenId).append(this.auftragsId).toHashCode();
}

}
[/code]
 
Zuletzt bearbeitet von einem Moderator:

Fu3L

Top Contributor
Java:
// Hinweis: instanceof nur bei finalen Klassen,
    // sonst erst auf null und dann auf Klassenidentität prüfen.

Kannst du mir erklären warum das so muss? Davon habe ich noch nichts gehört und bin immer bereit neues zu lernen^^ ;) Bloch erwähnt es zB nicht^^
 
N

nillehammer

Gast
Das ist eine seeehr lange Geschichte. Es geht dabei darum den Kontrakt von equals() einzuhalten. Der besagt under anderem, x.equals(null) muss immer false zurück liefern.

Weiterhin fordert er dass wenn x.equals(y) == true dann muss auch y.equals(x) == true sein. Bzw. wenn x.equals(y) == false dann muss auch y.equals(x) == false sein.

Die zweite Bedingung kann man nur sicher stellen, wenn man immer nur equals auf gleichen Klassen macht. Eine umfassende Einführung zum Thema gibt's hier: AngelikaLanger.com - Implementing the equals() Method - Part 1 - Angelika Langer Training/Consulting
Hier: AngelikaLanger.com - Implementing the equals() Method - Part 2 - Angelika Langer Training/Consulting
Und hier: AngelikaLanger.com - Implementing the hashCode() Method - Angelika Langer Training/Consulting

Edit: In seinem Buch "Effective Java Second Edition" widmet Bloch dem Thema auf jeden Fall ein paar Seiten. Die habe ich sogar selbst gelesen.

Gruß nillehammer
 

mvitz

Top Contributor
Weil im folgenden Beispiel der Equals Kontrakt dann nicht mehr korrekt ist.

Java:
pulic class Ball {
  public boolean equals(Object obj) {
    if (!(obj instanceOf Ball))
      return false;
    return true;
  }
}
public class Football extends Ball() {
  public boolean equals(Object obj) {
    if (!(obj instanceOf Football))
      return false;
    return true;
  }
}

public class Test {
  public static void main(String[] args) {
    Ball ball = new Ball();
    Football football = new Football();
    System.out.println(ball.equals(football)); // true
    System.out.println(football.equals(ball));  // false
  }
}

Edit: Für die genauere Begründung siehe Nillehammers Post.
 

Fu3L

Top Contributor
Ahh, ok, das Beispiel ist für mich gut nachvollziehbar. Danke an euch beide :)

Edit: Jezz hab ichs auch in Effective Java gefunden^^ :oops:
 
Zuletzt bearbeitet:

sinoptik

Mitglied
Danke für Eure Antworten. Ich habe es nun folgendermaßen gelöst:
Java:
String key = dc.getDate().toString() + dc.getKundenId() + dc.getAuftragsId();

Somit werden gleiche Keys bei verschiedenen Kombinationen vermieden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Objekte erzeugen Httprequest oder Httpclient Java Basics - Anfänger-Themen 3
W Javadoc HTML erzeugen mit allen dependency Java Basics - Anfänger-Themen 11
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
H Artefact mit Bild erzeugen Java Basics - Anfänger-Themen 11
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
F Aus eingelesener Datei korrekt Objekte erzeugen Java Basics - Anfänger-Themen 5
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
S Erzeugen einer eindeutigen ID Java Basics - Anfänger-Themen 2
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
L Simples Spielfeld erzeugen Java Basics - Anfänger-Themen 1
G Anklickbaren Text erzeugen Java Basics - Anfänger-Themen 2
I Object-Oriented Programming, Objekt erzeugen Java Basics - Anfänger-Themen 1
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
S Mit nextGaussian() positive Zahlen erzeugen? Java Basics - Anfänger-Themen 39
S Array erzeugen mit verschiedener Verteilung Java Basics - Anfänger-Themen 11
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
L Dynamische Anzahl an Arrays mit verschiedenen Namen erzeugen Java Basics - Anfänger-Themen 6
J Doppelte Ausgabe erzeugen Iterator Java Basics - Anfänger-Themen 6
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
K Methoden JTExtField mit Array erzeugen Java Basics - Anfänger-Themen 13
B Kann man eine Tabelle in Eclipse erzeugen und damit arbeiten? Java Basics - Anfänger-Themen 8
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
I TextField Array mit for Loop erzeugen Java Basics - Anfänger-Themen 4
M Objekte mit einer Schleife mehrmals erzeugen Java Basics - Anfänger-Themen 17
G Objekt der selben Klasse wie selbst mit Aufrufen des Konstruktors erzeugen Java Basics - Anfänger-Themen 14
J Eindeutige Nummer (8 stellig) erzeugen Java Basics - Anfänger-Themen 9
C Instanz einer Klasse während if-Abfrage erzeugen und bei zweiter if-Abfrage wiederverwenden Java Basics - Anfänger-Themen 6
B OOP Objekt in IF erzeugen - funktioniert nicht so richtig Java Basics - Anfänger-Themen 11
neerual Int-Felder erzeugen Java Basics - Anfänger-Themen 16
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
D Erste Schritte Random erzeugen Java Basics - Anfänger-Themen 28
P Objekt mit =new in Methode erzeugen Java Basics - Anfänger-Themen 4
L Threads Laufbild Erzeugen Problem mit Aktualisieren des JPanels Java Basics - Anfänger-Themen 2
J In Java einen Ton erzeugen Java Basics - Anfänger-Themen 8
C Array Muster erzeugen Java Basics - Anfänger-Themen 2
S Objekte "gegebenfalls" erzeugen Java Basics - Anfänger-Themen 5
D Java Ausdruck erzeugen / Formular Java Basics - Anfänger-Themen 4
N Objekt in Methode einer anderen Klasse erzeugen Java Basics - Anfänger-Themen 9
R Baum erzeugen Java Basics - Anfänger-Themen 61
D Objekt per If erzeugen. Java Basics - Anfänger-Themen 11
J Bildschirmausgabe erzeugen Java Basics - Anfänger-Themen 30
B Beliebig viele Rechtecke erzeugen Java Basics - Anfänger-Themen 5
J Objekt mit Methodendruchlauf erzeugen Java Basics - Anfänger-Themen 1
Detox Class Datei erzeugen nicht möglich über cmd Java Basics - Anfänger-Themen 1
P Erste Schritte [gelöst]Erzeugen einer Klasse aus der Klassenbibliothek Java Basics - Anfänger-Themen 4
C Int mit vorangestellten Nullen und maximal 4 stellen erzeugen. Java Basics - Anfänger-Themen 4
P Input/Output Objekte per Eingabe erzeugen Java Basics - Anfänger-Themen 1
D Erste Schritte Dynamisch Objekte erzeugen und diese durchsuchen Java Basics - Anfänger-Themen 7
U JNA: Strukturen erzeugen Java Basics - Anfänger-Themen 8
S Variablen Variable erzeugen und Array mit Variablen befüllen Java Basics - Anfänger-Themen 26
S Header- Datei erzeugen mit javah Java Basics - Anfänger-Themen 1
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
R Erste Schritte Schleife erzeugen (mit If Anweisung) Java Basics - Anfänger-Themen 3
I HTML Tabelle nur so lange erzeugen bis Höhe erreicht Java Basics - Anfänger-Themen 9
M Zusatzzahlen in array erzeugen Java Basics - Anfänger-Themen 5
B Stützstellen (Vektor) erzeugen? Java Basics - Anfänger-Themen 8
Z Erste Schritte 9x9 Felder Erzeugen+Aufrufen Java Basics - Anfänger-Themen 1
Y Variable Menge von Objekten erzeugen und mit ihren Attributen rechnen Java Basics - Anfänger-Themen 7
J Anzahl von for-Schleifen in Abhängigkeit von Zahleneingabe erzeugen Java Basics - Anfänger-Themen 1
J JLabels in schleife erzeugen mit verschiedenen namen? Java Basics - Anfänger-Themen 5
K JLabel zur Laufzeit dynamisch erzeugen Java Basics - Anfänger-Themen 7
F Input/Output Blocking file read erzeugen Java Basics - Anfänger-Themen 0
Thallius Klassen aus Classname programmatisch erzeugen. Wie geht das in java? Java Basics - Anfänger-Themen 5
B Zufallsdatum innerhalb eines bestimmten Bereiches erzeugen Java Basics - Anfänger-Themen 3
D JComboBox erzeugen Java Basics - Anfänger-Themen 1
J Erste Schritte Array dyn. erzeugen Java Basics - Anfänger-Themen 2
A OOP Objekte per Schleife erzeugen Java Basics - Anfänger-Themen 1
F Superklasse nochmals erzeugen? Java Basics - Anfänger-Themen 7
G Instanzen eines Interfaces erzeugen Java Basics - Anfänger-Themen 7
M Variablen Variable zur Laufzeit erzeugen Java Basics - Anfänger-Themen 3
P Vererbung Neues Objekt aus Vorlage erzeugen Java Basics - Anfänger-Themen 1
M Erzeugen beliebig vieler Objekte, aber wie wechselnde Bezeichner? Java Basics - Anfänger-Themen 5
W Objekte erzeugen Java Basics - Anfänger-Themen 2
N Interface Interface (sinnvoll) erzeugen Java Basics - Anfänger-Themen 8
L 6stellige Zufallszahlen erzeugen & auf einzigartigkeit prüfen Java Basics - Anfänger-Themen 3
A Kleinste Ziffer im Array suchen um Sortierung zu erzeugen Java Basics - Anfänger-Themen 2
Joew0815 Interface JSON Objekte aus Java Objekten erzeugen Java Basics - Anfänger-Themen 9
B OOP Objekte erzeugen mit Hilfe einer for Schleife Java Basics - Anfänger-Themen 29
Helgon Baumstruktur tiefe N erzeugen Java Basics - Anfänger-Themen 3
X Mehrere Objekte erzeugen Java Basics - Anfänger-Themen 8
G OOP-Frage - Grundlegendes zum erzeugen von Klassen Java Basics - Anfänger-Themen 7
P Kapselung Variable innerhalb einer inneren Klasse ansprechen ohne ein Objekt erzeugen zu müssen? Java Basics - Anfänger-Themen 6
G Methoden BigInteger Zufallszahlen erzeugen Java Basics - Anfänger-Themen 5
Phash Kombinationen erzeugen Java Basics - Anfänger-Themen 4
M Initialisierungsblock beim Erzeugen einer Instanz Java Basics - Anfänger-Themen 6
B Ein Array von Map erzeugen, wie??? Java Basics - Anfänger-Themen 3
M Neues Objekt erzeugen mit Klassennamen oder ohne Java Basics - Anfänger-Themen 5
L Button erzeugen. Java Basics - Anfänger-Themen 4
Manello GUI mit exe erzeugen? Java Basics - Anfänger-Themen 3
StrikeTom Zufälliges Alphabet erzeugen Java Basics - Anfänger-Themen 6
D Textausgabe erzeugen Java Basics - Anfänger-Themen 11
C Methoden Objekte mit Hilfe einer Schleife in einer ArrayList erzeugen Java Basics - Anfänger-Themen 26
H Methoden Array aus Punkten erzeugen, mittels Punkt-Klasse Java Basics - Anfänger-Themen 5

Ähnliche Java Themen


Oben