Ich muss die HashSet Methode implementieren, aber ich weiß nicht wie man Schnelligkeit mit HashSet rechnen kann ? kann jemand bitte erklären was genau unter Testfall 1& 2 gemeint ist ?
Schreibe eine neue, effizientere Implementation der Methode hashCode.
Der Hashcode muss dafür weiterhin möglichst leicht zu berechnen sein, aber auch dafür sorgen, dass die Bücher in einer HashMap gleichmäßig auf die verfügbaren Buckets verteilt werden.
⚠️ Achtung: halte dich an den Vertrag zwischen hashCode und equals! Alle Bücher, die mit equals als gleich bewertet werden, müssen auch den gleichen Hashcode haben!
Testverfahren | Methode hashCode
Schreibe eine neue, effizientere Implementation der Methode hashCode.
Der Hashcode muss dafür weiterhin möglichst leicht zu berechnen sein, aber auch dafür sorgen, dass die Bücher in einer HashMap gleichmäßig auf die verfügbaren Buckets verteilt werden.
⚠️ Achtung: halte dich an den Vertrag zwischen hashCode und equals! Alle Bücher, die mit equals als gleich bewertet werden, müssen auch den gleichen Hashcode haben!
Testverfahren | Methode hashCode
- Testfall 1 & 2 überprüfen, wie schnell ein HashSet mit tausenden von Büchern gefüllt werden kann. Deine Implementation muss dabei signifikant schneller sein1als der statische Hashcode 0.
- Schlägt einer dieser Tests fehl, verteilt dein Hashcode die Bücher wahrscheinlich nicht auf ausreichend viele Buckets! Stelle sicher, dass nicht allzu viele nicht gleiche Bücher den gleichen Hashcode haben.
- Testfall 3 überprüft, dass dein HashSet mit der korrekten Anzahl an Büchern gefüllt wird und keine Duplikate zulässt, also Bücher, die nach equalsgleich sein müssten.
- Schlägt dieser Test fehl, hast du den Vertrag zwischen hashCode und equals verletzt! Stelle sicher, dass es keine Bücher gibt, die nach equals gleich sind, aber unterschiedliche Hashcodes haben.
- 1 Der Test ist bestanden, wenn die Implementation mehr als 80% schneller ist (ca. 20 ms). Mit relativ wenig Aufwand kann die Ausführungszeit aber sogar auf unter 3 ms reduziert werden.
-
Java:
public class Buch { private final long _isbn; private final String _autor; private final String _titel; private final int _preis; private final int _kaufjahr; /** * Erzeugt ein Buch, welches der Sammlung hinzugefuegt * werden soll. * * @param isbn ISBN des Buches * @param autor Autor:in des Buches * @param titel Titel des Buches * @param preis Preis in Eurocent, zu dem das Buch * gekauft wurde * @param kaufjahr Jahr, in dem das Buch gekauft wurde */ public Buch (long isbn, String autor, String titel, int preis, int kaufjahr) { _isbn = isbn; _autor = autor; _titel = titel; _preis = preis; _kaufjahr = kaufjahr; } /** * Gibt die ISBN des Buches zurueck. * @return ISBN */ public long gibISBN() { return _isbn; } /** * Gibt die Autor:in des Buches zurueck. * @return Autor:in des Buches */ public String gibAutor() { return _autor; } /** * Gibt den Titel des Buches zurueck. * @return Titel des Buches */ public String gibTitel() { return _titel; } /** * Gibt den Preis zurueck, zu dem das Buch gekauft wurde. * @return Kaufpreis in Eurocent */ public int gibPreis() { return _preis; } /** * Gibt das Jahr zurueck, in dem das Buch gekauft wurde. * @return Kaufjahr */ public int gibKaufjahr() { return _kaufjahr; } @Override public boolean equals(Object o) { // ueberpruefe, ob das uebergebene Object ein Buch ist if (o instanceof Buch) { // sichere dem Kompiler zu, dass der Typ wirklich Buch ist Buch b = (Buch) o; // vergleiche an der typsicheren Variable alle noetigen Eigenschaften if(this._titel.equals(b._titel) && this._autor.equals(b._autor)){ return true; } // wenn das Object kein Buch ist, kann es nicht gleich mit einem Buch sein return false; } @Override public int hashCode() { return 0; } }
Zuletzt bearbeitet: