Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
10.1
Hi,
ich beziehe mich auf Abbildung 1 des Blattes:
Wenn ich im Bucket 0 den key a lösche, dann wird der key ja auf null gesetzt und der value auch und nur der nextEntry verweißt noch auf den key c.
Wenn ich jetzt im nächsten Schritt aber c auch lösche, soll dann c nur gelöscht werden oder soll auch a mitgelöscht werden?
Viele Grüße
Smithers
Moin,
beim Löschen direkt den ganzen Entry entfernen und die Referenzen entsprechend umbiegen. Dann erübrigt sich Deine Frage (hoffentlich). Falls nicht → fragen.
Gruß,
A.
Danke!
Eine weitere Frage hat sich bei mir ergeben, im späteren Aufgaben verlauf sollen wir ja die Größe der Buckets ändern. Nun ist es ja so, dass die Plätze durch eine hash Funktion in Kombination mit dem aktuellen Buckets vergeben wird. Wenn ich jetzt die Größe ändere stellt sich mir die Frage, ob sich dann auch die Plätze ändern.
Kurzes Bsp:
Ich habe:
Bucket 0 → Element1
Bucket 1 → Element2 → Element3 → Element4
Wenn die Länge des Buckets Array nun ändert, kann sich dann auch die Verteilung ändern d.h. das beispielweise:
Bucket 0 → Element1 → Element2
Bucket 1 → Element3 → Element4
Viele Grüße
Smithers
Kann es sein, dass sich im EST wieder ein Fehler eingeschlichen hat? Bei mir wird ein rotes Kreuz angezeigt, “… doesn’t compile with given test case…”, obwohl ich keine Signaturen veraendert habe, etc. Der Fehler taucht auch auf, wenn ich eine unveraenderte Vorlage abgeben moechte.
bei mir das gleiche…
Ich denke, dass es daran liegt. Hab nämlich noch die frühere Version ohne die Assertions Aktivierungsüberprüfung und es kompiliert ohne Probleme.
Guten Abend,
der Fehler liegt in der main-Methode, System.exit ist nicht erlaubt, habe ich leider erst nach den Problemen erfahren.
Den Skeleton auf der Homepage habe ich aktualisiert, er wirft jetzt eine Exception. Bitte neu runterladen (secure) oder main Methode anpassen (not so secure).
Bitte entschuldigt die Umstände!
Happy coding,
Andreas
Nach dem resize müssen get/put/etc. natürlich noch wie beschrieben funktionieren.
Ablauf:
Initial nur 1 Bucket:
0 → (0) → (1) → (2) → (3)
resize(3);
get(2);
In welchem Bucket sollte die 2 liegen, damit sie gefunden wird?
Cheers,
A.
Die Frage die sich mit stellt ist, ob das ursprüngliche buckets Array eins zu eins ins neue Kopiert werden soll. d.h. es kommen einfach am Ende ein paar leere Bucketplätze hinzu
Überlege Dir, wie z.B. get einen Antrag versucht in der Tabelle nachzuschlagen. Und ob das noch funktionier kann oder nicht, gegeben die formulierte Strategie.
Gruß,
Andreas
PS: Zur Not einfach erstmal so coden und ausprobieren.
PS2: Ausprobieren > main-Tests
Hi,
hab da mal zwei Fragen zur 10.1:
-
zu remove(key):
Soll nur ein Entry pro Durchlauf entfernt werden oder soll man gleich alle Entries die den selben Key haben in einem Rutsch löschen?
Denn laut Aufgabenstellung bei insert ist es ja nicht verboten mehrere Entries mit dem selben Key einzufügen.
10.1 c)
“Die Methode insertEntry() fügt den gegebenen Schlüssel-Wert-Eintrag an dem gegebenen Index in die Streutabelle ein (ohne zu überprüfen ob bereits ein Eintrag mit dem selben Schlüssel existiert).” -
@SuppressWarnings(“unchecked”):
Diese Annotation bezieht sich ja auf die Erstellung einer Instanz von Entry WENN ich das richtig verstanden habe.
Müsste dann nicht auch die Methode put() damit gekennzeichnet sein, da in dieser Methode auch Instanzen von Entry erstellt werden müssen?
Die Methode insertEntry ist nur aus didaktischen Gründen public, weil ihr dann euer remove direkt testen könnt. In einer „normalen“ Implementierung wäre die Methode natürlich private und es könnten nur Einträge per put hinzukommen. Meint: wir werden in unseren Tests nie mehrere Entries mit dem gleichen Schlüssel per insertEntry einfügen.
Warnung: Put hingegen werden wir garantiert mit dem gleichen Key mehrfach aufrufen und das sollte dann wie spezifiziert funktionieren.
SuppressWarnings wird zur Erstellung des Arrays buckets benötigt. Begründung in den Übungsfolien: Arrays eines generischen Typs sind in Java nicht möglich.
S.o., hast Du nicht ganz richtig verstanden
Happy coding,
Andreas
Ich hätte zur c) mal ne Frage und zwar: liefert nextEnrtyInBucket in Zusammenhang mit dem jeweiligen Bucket das letzte Element des Buckets?
Nein, das nächste ;). vorletzesEntry.nextEnrtyInBucket liefert das letzte.
In einem Bucket können beliebig viele Entrys verkettet sein, wenn ich das richtig verstanden habe.
Gibt es für diese Aufgabe noch weitere Testfälle? Die in der Main-Methode sind ja ziemlich dürftig und testen ja nicht mal eine Kollision, d. h. die verketteten Listen werden ja gar nicht getestet.
10.1.b)
In der aufgabe steht @Verwenden sie das Feld size fuer die Buchaltung der elemente… size is aber kein Feld sondern nur eine Variable. Soll Size eigentlich ein Arraz sein? so das mirt der jeweilige size(i) die Anzahl der Elmente im Bucket angibt oder ist damit tatsaechlich die gesamt elementzahl von bucket gemeint?
“Feld” meint in diesem Kontext “globale Variable”.
Beim Testen meines Codes ist mir folgendes aufgefallen:
Wenn man x Entries in die Hash Tabelle einfügt…
e1 → e2 → e3
…anschließend e2 löscht und es mittels insertEntry() wieder einfügt…
e1 → e3 → e2
…dann hat man einen Zyklus zwischen e2 und e3, da e2.nextEntryInBucket immer noch auf e3 verweist. Müssen wir diesen Fall, also, dass ein Element in die Hash-Tabelle eingefügt wird, von dem das .nextEntryInBucket nicht auf null zeigt abfangen, indem wir bspw. bei insertEntry() überprüfen ob entry.nextEntryInBucket != null ist und in diesem Fall den Wert nachträglich auf null setzen?
Hallo,
bei mir scheiterts leider schon bei der a)
Und zwar wird mein Hash-table buckets nicht initialisiert, nachdem in der main-Methode
ManualResizingHashMap<Integer, String> hashMap = new ManualResizingHashMap<Integer, String>(11);
ausgeführt wurde. Denn ich bekomme gesagt, dass an der Stelle
assert (hashMap.buckets.length == 11) : "Number of buckets does not match";
bei mir eine NullPointerException geworfen wird. Nun hab ich jedoch den Konstruktor analog zur Folie 58 der Übung, wie folgt umgesetzt:
Entry<K,V>[] buckets = new Entry[capacity];
Weiß jemand zufällig woran es hier scheitert? =)