hashCode() erzeugen.

Status
Nicht offen für weitere Antworten.

Tico

Mitglied
Hallo !

Also ich habe ein kleines Problem:

ich habe eine klasse : Kante.

Unter anderem habe ich eine function wie folgt darin :

public int hashCode()
{
....
}


Also ich muss jetzt einen eindeutigen hashCode erzeugen. Leider habe ich dabei keine "InputDaten" wie einen integer oder sowas ... und wenn ich die von StandardHashmethode von Object aufrufe, dann krieg ich einen StackOverflowError .. Wie kann ich einen eindeutigen hashCode zu diesem Object erstellen ? und warum kommt der StackOverflowError ?

Danke im Voraus

Tico
 

Leroy42

Top Contributor
Einen Stack-Overflow-Error bekommst du nur dann,
wenn du schreibst

Code:
public int hashCode() {return hashCode();}

Schreib' einfach
Code:
public int hashCode() {return super.hashCode();}

Aber wenn du das schreibst, kannst du das Überschreiben
von hashCode doch einfach weglassen. ???:L
 

Tico

Mitglied
Ok, schonmal danke für die superschnelle Antwort !

...
naja also ich hatte es so probiert :

public int hashCode()
{
return this.hashCode();
}

und dann den error erhalten, ich werds so probieren wie du vorgeschlagen hast,... .. und ja, es funktioniert anscheinend so. also zumindest bekomm ich den StackOverflow nichtmehr .. ;)
Ich habe noch andere Klassen, in einer davon muss ich Objekte dieser Klasse "Kante" vergleichen .. also x.equals(y)
aufrufen können, wobei x und y objekte der klasse Kante sind. also brauche ich doch die hashCode() Methode, oder ?
in equals teste ich dann , ob die beiden hashCodes identisch sind . ?

Gurss

Tico
 

André Uhres

Top Contributor
Code:
class Kante{
    private int x1, y1, x2, y2;
    public Kante(final int x1, final int y1, final int x2, final int y2){
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
    public int hashCode() {
        int result = 17;
        result = 37*result + x1;
        result = 37*result + y1;
        result = 37*result + x2;
        result = 37*result + y2;
        return result;
    }
    public boolean equals(Object obj) {
        if(obj == this) return true;
        if(!(obj instanceof Kante)) return false;
        Kante k = (Kante) obj;
        return x1==k.x1 && x2==k.x2 && y1==k.y1 && y2==k.y2;
    }
    public String toString() {
        return "Kante: [("+x1+", "+y1+") ("+x2+", "+y2+")]";
    }
}
Hier ist das "hashCode" Rezept nach Joshua Bloch:

1. Speichere einen konstanten Wert (nicht 0), z.B. 17, in eine int Variable result.

2. Für jedes bedeutende Feld f im Objekt (d.h. jedes Feld, das in der equals Methode gebraucht wird), mach dies:

2.a. Errechne einen int Hashcode c für das Feld:
- wenn das Feld ein boolean ist, rechne (f ? 0 : 1)
- wenn das Feld ein byte, char, short oder int ist, rechne (int)f
- wenn das Feld ein long ist, rechne (int)(f ^ (f >>> 32))
- wenn das Feld ein float ist, rechne Float.floatToIntBits(f)
- wenn das Feld ein double ist, rechne Double.doubleToLongBits(f) und dann den resultierende long wie oben
- wenn das Feld eine Objektreferenz ist, und die equals Methode vergleicht die Felder durch rekursives Aufrufen von equals,
dann rufe hashCode rekursiv über das Feld auf. Wenn ein komplizierterer Vergleich benötigt wird,
errechne eine "kanonische Darstellung" für das Feld und rufe hashCode über die kanonischen Darstellung auf.
- wenn das Feld ein Array ist, behandle es so, als ob jedes Element ein separates Feld wäre.
D.h., rechne einen Hashcode für jedes bedeutende Element in dem du die Regeln rekursiv anwendest,
und kombiniere diese Werte wie in 2.b beschrieben.

2.b. Kompiniere den Hashcode c zum result wie folgt:
result = 37*result + c;

3. Gib result zurück.

4. Wenn du fertig bist, frag dich, ob Instanzen, die equal sind, gleiche Hashcodes haben.
Wenn nicht, finde den Grund heraus, und löse das Problem.
 

Leroy42

Top Contributor
Tico hat gesagt.:
in equals teste ich dann , ob die beiden hashCodes identisch sind . ?

Die Methode hashCode von Object liefert aber nur dann denselben
Wert, wenn auch die Objekte identisch sind.

Wenn du zwei verschiedene Objekte als gleich ansehen
willst, mußt du schon selbst eine hashCode-Methode
schreiben die z.B irgendwelche Instanzvariablen
deines Objekts zur Bestimmung des hashCodes heranzieht.
 

Tico

Mitglied
ok ..

Zitat: "mußt du schon selbst eine hashCode-Methode schreiben" ....

das versteh ich .. ok, und ich versteh auch warum das sein muss, aber das bringt mich zurück zu meinem alten problem ... ich habe keinerlei attribute vom typ integer oder ähnliches in meiner klasse ... :(

ich peils im moment einfach nicht. wie ich da eine hashMethode bauen soll ..alles was ich hab ist ein attribut

"private Object data " .. also vom Typ Object .. und das hilft mir wohl nicht weiter, oder?

Gruss

Tico
 

Tico

Mitglied
/**
* Implementierung von {@link IEdge}.
*
*/
public class Edge implements IEdge
{

private INode tempNode;


private Object data;
private INode startNode;
private INode endNode;
private double weight;


/********************************** KONSTRUKTOREN ******************************************/



/**
* Erzeugt eine neue Kante mit gegebenem Start-, End-Knoten und Datum.
*
* @param start
* Start-Knoten der neuen Kante; nicht <code>null</code>
* @param end
* End-Knoten der neuen Kante; nicht <code>null</code>
* @param data
* Datum der neuen Kante; nicht <code>null</code>
* @throws IllegalArgumentException
* wenn <code>start</code>, <code>end</code> oder <code>data</code> <code>null</code> ist
*/
public Edge(INode start, INode end, Object data) throws IllegalArgumentException
{
if ( (start == null) || (end == null) || (data == null) )
{
throw new IllegalArgumentException("Es darf im Konstruktor von Edge nichts mit null initialisiert werden!");
}

startNode = start;
endNode = end;
this.data = data;
weight = 1.0;
}

/**
* Erzeugt eine neue Kante mit gegebenem Start- und End-Knoten. Das Datum der neuen Kante ist <code>null</code>.
*
* @param start
* Start-Knoten der neuen Kante; nicht <code>null</code>
* @param end
* End-Knoten der neuen Kante; nicht <code>null</code>
* @throws IllegalArgumentException
* wenn <code>start</code> oder <code>end</code> <code>null</code> ist
*/
public Edge(INode start, INode end) throws IllegalArgumentException
{
if ( (start == null) || (end == null) )
{
throw new IllegalArgumentException("Start- und Endknoten dürfen nicht mir null initialisiert werden!");
}

startNode = start;
endNode = end;
data = null;
}


/********************************** METHODEN ******************************************/

public boolean equals(Object o)
{
return ( hashCode() == o.hashCode());
}

public Object getData()
{
return data;
}

public INode getEndNode()
{
return endNode;
}

public INode getStartNode()
{
return startNode;
}

public int hashCode()
{
return super.hashCode();
}

public void setData(Object data)
{
this.data = data;
}





}
 

byte

Top Contributor
Für gewöhnlich erzeugst Du den Hashcode über alle Felder der Klasse. Wie man den Hashcode von Primitiven erzeugt, steht in meinem Link (siehe oben). Hashcode von komplexen Objekten werden halt an das Objekt delegiert (member.hashcode()). Dabei muss man darauf achten, dass man keine Zyklen erzeugt, sonst gibts ne Endlosschleife.
 

André Uhres

Top Contributor
Code:
   public int hashCode() {
        int result = 17;
        result = 37*result + startNode.hashCode();
        result = 37*result + endNode.hashCode();
        result = 37*result + data.hashCode();
        return result;
    }
    public boolean equals(Object obj) {
        if(obj == this) return true;
        if(!(obj instanceof Edge)) return false;
        Edge k = (Edge) obj;
        return startNode.equals(k.startNode) && endNode.equals(endNode) && data.equals(k.data);
    }
Dem Kommentar nach ist data übrigens ein Datum :wink:
 

Tico

Mitglied
puh .. hey, vielen dank! ja, da hätte ich eigentlich auch draufkommen sollen .. aber ich stand echt auf dem schlauch .. :(

wegen dem datum, ja ,das ist etwas unglücklich ausgedrückt ... aber es ist nicht der Typ Date gemeint ..

DANKE !

MFG

Tico
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A HashCode von DatagrammPacket(content) erzeugen. Allgemeine Java-Themen 3
T HashCode korrekt Allgemeine Java-Themen 7
F Methoden hashCode() & equals() Allgemeine Java-Themen 13
A JUnit/Hashcode Problem Allgemeine Java-Themen 5
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
pg1337 hashCode() verändert sich Allgemeine Java-Themen 15
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
M hashCode() Allgemeine Java-Themen 3
N hashCode() für zwei ints Allgemeine Java-Themen 5
C hashCode() Allgemeine Java-Themen 2
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
hdi Wahrscheinlichkeitsfrage bei hashCode() mit modulo Allgemeine Java-Themen 7
Guybrush Threepwood HashCode-Generierung Allgemeine Java-Themen 4
G hashCode() == Speicheradresse? => warum nur int? Allgemeine Java-Themen 28
X hashCode() Berechnung Allgemeine Java-Themen 5
M hashCode Allgemeine Java-Themen 9
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
T eine Frage zu hashCode() Allgemeine Java-Themen 11
U Hashtables und hashCode() Allgemeine Java-Themen 6
I Module-Info für Jar erzeugen Allgemeine Java-Themen 7
S Klickbare Stacktraces selber erzeugen..? Allgemeine Java-Themen 9
I OpenPDF (ehem. iText) will kein PDF mit CMYK only erzeugen Allgemeine Java-Themen 6
J Runable jar erzeugen Allgemeine Java-Themen 2
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
temi Valides Dreieck erzeugen Allgemeine Java-Themen 6
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
dereki2000 Windows Benachrichtigung erzeugen Allgemeine Java-Themen 2
J In einem Set doppelte Elemente erzeugen Allgemeine Java-Themen 4
F Objekte erzeugen Allgemeine Java-Themen 1
M Variabe a[i] erzeugen Allgemeine Java-Themen 8
Meeresgott Kapselung Tabellen der Datenbank erzeugen. Allgemeine Java-Themen 7
Thallius String erzeugen sehr langsam Allgemeine Java-Themen 16
L ICS-Kalenderdatei aus PDF erzeugen Allgemeine Java-Themen 0
A Jasper Report Performance bei PDF erzeugen Allgemeine Java-Themen 0
F Java Spintax: Alle Kombinationen Erzeugen Allgemeine Java-Themen 2
L Klassen Konstruktor soll Objekt anderer Klasse erzeugen Allgemeine Java-Themen 2
H Vektor rekursiv erzeugen Allgemeine Java-Themen 2
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
V 2D-Grafik BufferdImage aus gif Datei in Jar erzeugen geht nicht. Allgemeine Java-Themen 6
R Aus Eclipse Projekt ein UML erzeugen Allgemeine Java-Themen 3
G Texte erzeugen Allgemeine Java-Themen 3
R Großes Hash-Set erzeugen Allgemeine Java-Themen 12
P Excel-Sheets erzeugen aus Report Allgemeine Java-Themen 2
Ollek Barcode mit Barcode4J erzeugen - Exception Allgemeine Java-Themen 4
P Arrays erzeugen Allgemeine Java-Themen 5
G Strings erzeugen Allgemeine Java-Themen 20
C QR-Codes erzeugen. Allgemeine Java-Themen 43
M Input/Output Datei erzeugen funktioniert nicht (immer) vom .jar aus Allgemeine Java-Themen 5
T "Platzsparende" und "schnelle" Indizes erzeugen Allgemeine Java-Themen 10
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
E Objekt beim Erzeugen in ArrayList Allgemeine Java-Themen 9
D 2D-Grafik Funktionierende .jar datei mit Images (jpg) erzeugen Allgemeine Java-Themen 2
S Schnell eine fortlaufende nummer erzeugen SQL, kein Primkey Allgemeine Java-Themen 8
M Graphen erzeugen und visualisieren, jgraph oder was was anderes? Allgemeine Java-Themen 2
M Klassen Zugriff auf getMethode ohne Klasse zu erzeugen Allgemeine Java-Themen 6
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
M Txt einlesen & Objekte erzeugen Allgemeine Java-Themen 2
Y Eclipse ppt Folie erzeugen + text plazieren Allgemeine Java-Themen 4
G log4j File erzeugen und Pfad bestimmen Allgemeine Java-Themen 3
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
S Algorithmus um Labyrinth zu erzeugen Allgemeine Java-Themen 6
A auführbare Jar erzeugen mit ant Allgemeine Java-Themen 5
D Browser-Objekt erzeugen Allgemeine Java-Themen 8
Developer_X Java ton erzeugen Allgemeine Java-Themen 3
D character kodierung, barcode für barcode font erzeugen Allgemeine Java-Themen 4
D Worddocumente erzeugen Allgemeine Java-Themen 4
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
A Dummy-Objekte für Webgui erzeugen Allgemeine Java-Themen 12
S JUnit: Erzeugen einer IOException Allgemeine Java-Themen 9
S Neue Instanz eines Objekts erzeugen - Konstruktor erhaelt Parameter. Allgemeine Java-Themen 5
A AES Key aus Text erzeugen Allgemeine Java-Themen 2
N JFrame Icon selbst erzeugen Allgemeine Java-Themen 2
D Objekte nur unter bestimmten Voraussetzungen erzeugen Allgemeine Java-Themen 4
F Klasse vorhanden - wie daraus Objekt erzeugen Allgemeine Java-Themen 8
C PDF erzeugen Allgemeine Java-Themen 3
Landei Objekte ohne Konstruktoraufruf erzeugen Allgemeine Java-Themen 7
F Zufallszahl erzeugen Allgemeine Java-Themen 4
P Objekt einer Klasse erzeugen, die als String vorliegt Allgemeine Java-Themen 3
multiholle Objekt einer Klasse anhand eines String erzeugen Allgemeine Java-Themen 3
M odt-Datei erzeugen Allgemeine Java-Themen 6
G File zur Laufzeit erzeugen Allgemeine Java-Themen 4
G Windows Pipe erzeugen Allgemeine Java-Themen 12
A Wie eine Seriennummer erzeugen und auswerten? Allgemeine Java-Themen 11
G erzeugen von "ArrayList<Integer>[][]" Allgemeine Java-Themen 7
T Log4J: Bei Programmstart immer eine neue LogDatei erzeugen Allgemeine Java-Themen 9
S Zweidimensionales Array neue Zeile erzeugen Allgemeine Java-Themen 3
A Objekt in einem Array erzeugen Allgemeine Java-Themen 6
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
V Enums aus Datei-Einträgen erzeugen? Allgemeine Java-Themen 6
M KML Datei automatisch erzeugen Allgemeine Java-Themen 3
H Problem mit erzeugen eienr neuen Session Allgemeine Java-Themen 3
G zweierKompliment erzeugen Allgemeine Java-Themen 12
L Objekt erzeugen Allgemeine Java-Themen 2
R Jasper iReport erzeugen Allgemeine Java-Themen 7
MQue über iBatis Tabellen erzeugen Allgemeine Java-Themen 4
V Aus String -> Objekt einer Klasse erzeugen Allgemeine Java-Themen 7
P UML erzeugen Allgemeine Java-Themen 3
M wav datei/ ton erzeugen Allgemeine Java-Themen 4
M eigenen Desktop erzeugen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben