hashCode() überschreiben

Shibas

Mitglied
Moin,

ich hab das problem das ich für meine Klasse die hashCode methode überschreiben möchte um einen eigenen algorithmus zu testen. Allerdings ist es so das die überschriebene Methode in meiner Klasse nie in meiner testmethode genutzt wird. Kann mir wer sagen was ich falsch mache?

mfg

Shibas

Java:
package core;

import java.util.Arrays;


public class Hashdaten {

	// local
	private String test = "test";
	private String[] db = null;
	private String[][] hashlist = null;
	private long time1 = 0;
	private long time2 = 0;
	private long time = 0;
	private Console c = null;
	private Node[] nodelist = null;

	// Konstruktor
	public Hashdaten(String[] db, Console c) {
		this.db = db;
		this.c = c;

	}

	public void test() {
		System.out.println(test.hashCode());
	}

	// Suchen
	public boolean search(String key) {

		return true;
	}

	// Einfügen
	public void insert(String key) {

	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Hashdaten other = (Hashdaten) obj;
		if (!Arrays.equals(db, other.db))
			return false;
		if (!Arrays.equals(hashlist, other.hashlist))
			return false;
		if (!Arrays.equals(nodelist, other.nodelist))
			return false;
		if (test == null) {
			if (other.test != null)
				return false;
		} else if (!test.equals(other.test))
			return false;
		return true;
	}

	@Override
	public int hashCode() {
		System.out.println("Test");
		final int prime = 31;
		int result = 1;
		result = prime * result + Arrays.hashCode(db);
		result = prime * result + Arrays.hashCode(hashlist);
		result = prime * result + Arrays.hashCode(nodelist);
		result = prime * result + ((test == null) ? 0 : test.hashCode());
		return result;
	}

	// HashCode Ende-----------------------------------------------------------

	// getter & setter
	public String[] getDb() {
		return db;
	}

	public void setDb(String[] db) {
		this.db = db;
	}

}
 
ich hab in der überschriebenen methode eine consolen ausgabe eingefügt nur diese taucht nicht auf von daher wird meiner meinung nach immer noch die normale hashCode Methode aufgerufen.

Das einzige worüber ich mir nicht sicher bin ist ob ich zum überschreiben meine klasse noch durch irgendeine erweitern muss aber ich wüsste da jetzt nicht welche.
 
Da gibt es doch nicht mal eine main-Methode, was willst du denn da aufrufen? Es muss ja auch noch eine Klasse geben, die
Code:
Hashdaten
verwendet.
Falls du darauf hinaus willst, dass die
Code:
test
-Methode was anderes liefert, dann ist das klar: du gibst ja auch den Hashcode von einem String :bahnhof:
 
Java:
public class HashdatenTest {
    public static void main(String args[])
    {
        Hashdaten h = new Hashdaten(null, null);
        Map map = new HashMap();
        map.put(h,h);
    }
}

Gibt "Test" aus...
 
Ok ich hab damit mal ausprobiert und es wird auch "Test" ausgeben weil er in die Methode von mir reingeht.

System.out.println(test.hashCode());

ruft allerdings immernoch die standard methode auf egal wie ich den algorithmuss in meiner methode ändere der wert von hashCode ist weiterhin 3556498
 
Ok ich hab damit mal ausprobiert und es wird auch "Test" ausgeben weil er in die Methode von mir reingeht.

System.out.println(test.hashCode());

ruft allerdings immernoch die standard methode auf egal wie ich den algorithmuss in meiner methode ändere der wert von hashCode ist weiterhin 3556498

Das hat dir doch XHelp bereits beantwortet, das kommt weil du hashcode nicht auf dem Objekt deiner Klasse aufrufst, sondern von dem String-Objekt!
Du hast also nichts anderes als:
Java:
	public static void main(String[] args)  {
		System.out.println("test".hashCode());
	}

Du suchst wohl viel mehr
Java:
    public void test() {
        System.out.println(this.hashCode());
    }

???:L
 
Wie schon gesagt, das wird auch so bleiben. test ist doch eine Instanz von
Code:
String
und du änderst den HashCode von
Code:
Hashdaten
. Den Hashcode von String wirst du auch nicht ändern können, da man die Klasse String nicht verändern kann.
 
Ok dann muss ich mit meinen prof nochmal rücksprache halten. Wir sollen den hashCode von String überschreiben damit wir nen eigenen algorithmus statt

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

erstellen sollen aber wenn das so nicht funktioniert weiss ich jetzt auch nicht was ich machen soll 🙁
 
Ok dann muss ich mit meinen prof nochmal rücksprache halten. Wir sollen den hashCode von String überschreiben damit wir nen eigenen algorithmus statt

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

erstellen sollen aber wenn das so nicht funktioniert weiss ich jetzt auch nicht was ich machen soll 🙁

Vermutlich hast du nur die Aufgabe falsch interpretiert...wie lautet denn die genaue Aufgabenstellung?!
 
Bauen Sie eine Hashtabelle mit Verkettung der Überläufer auf und führen darauf die beschriebenen Suchvorgänge aus. Die Klassen HashSet, LinkedList dürfen nicht verwendet werden. Zusätzliche Angaben:

- Programmieren Sie zur Verkettung der Überläufer eine verkettete Liste.
- Programmieren Sie 2-3 verschiedene Hash-Funktionen für Strings. Erläutern Sie die
Hash-Funktionen. Überschreiben Sie dazu die Methode hashCode.
- Halten Sie die Größe der Hashtabelle variabel. Erperimentieren Sie mit verscheidenen
Größen.
- Mit welchen Wahlen zu Hashfunktion und Größe der Hashtabelle erzielen Sie gute
Ergebnisse bzgl. der Aufwände für Aufbau und Suchvorgänge.
 
Du könntest eine Klasse erstellen, die den String gespeichert hält, aber einen eigenen hashCode hat:
Java:
public class DeinString {
  private String s;
  public DeinString(String s) {
    this.s = s;
  }

  public boolean equals(Object obj) {
    if (obj instanceof String) {
      return s.equals((String) obj);
    } else {
      return false;
    }
  }

  public int hashCode() {
    //hier eben die HashCode berechnung anhand von String s
  }
}
 
Danke erstmal ich werde das mal ausprobieren vielleicht finde ich noch eine möglichkeit die umleitung in der klasse selber zu machen^^
 

Zurück
Oben