0 Daumen
242 Aufrufe

Aufgabe:

Machen Sie die Klasse SimpleHT zur generischen Klasse SimpleHT<K, V>, in welcher Schlüssel vom Typ K und Werte vom Typ V sind (hier sind die Namen von K und V eine Namenskonvention für Schlüssel-Wert-Paare, englisch Key-Value-Pairs). Die generischen Typen K und V sind Parameter, die bei der Instanziierung der Klasse durch beliebigie Typen ersetzt werden können.

Natürlich können Sie jetzt nicht mehr einfach (key mod m) als Hashfunktion verwenden, denn der Modulo-Operator ist nicht für alle möglichen Schlüsseltypen K definiert. Verwenden Sie stattdessen erstmal (key.hashCode() mod m). In Java erbt jede Klasse von der Klasse Object, und die Klasse Object stellt die Methode hashCode bereit.

Die Funktionalität ist wie folgt:

• Der Aufruf von hashCode() gibt einen int-Wert zurück. Wird die Methode wiederholt für das gleiche Objekt aufgerufen, wird jedes mal der gleiche Wert zurückgegeben.

• Zwei Objekte a und b mit a.equals(b)==true müssen den gleichen hashCode haben. • Zwei Objekte a und b mit a.equals(b)==false dürfen den gleichen hashCode haben.

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Um die Klasse SimpleHT zu einer generischen Klasse mit den Typen K für Schlüssel und V für Werte zu machen und eine Hashfunktion basierend auf der hashCode()-Methode der Objekte zu verwenden, können wir das folgende Codebeispiel verwenden:

Generische Klasse SimpleHT<K, V>

java
import java.util.LinkedList;

// Definition der generischen Klasse
public class SimpleHT<K, V> {
    private int m;
    private LinkedList<Entry<K, V>>[] table;

    // Konstruktor der Klasse
    @SuppressWarnings("unchecked")
    public SimpleHT(int m) {
        this.m = m;
        table = new LinkedList[m];
        for (int i = 0; i < m; i++) {
            table[i] = new LinkedList<>();
        }
    }

    // Definition der inneren Klasse Entry zur Speicherung von Schlüssel-Wert-Paaren
    private static class Entry<K, V> {
        K key;
        V value;

        Entry(K key, V value) {
            this.key = key;
            this.value = value;
        }
    }

    // Hashfunktion basierend auf hashCode() und Modulo-Operator
    private int hash(K key) {
        return (key.hashCode() & 0x7fffffff) % m;
    }

    // Methode zum Hinzufügen oder Aktualisieren eines Eintrags
    public void put(K key, V value) {
        int index = hash(key);
        LinkedList<Entry<K, V>> bucket = table[index];

        for (Entry<K, V> entry : bucket) {
            if (entry.key.equals(key)) {
                entry.value = value;
                return;
            }
        }
        
        bucket.add(new Entry<>(key, value));
    }

    // Methode zum Abrufen eines Werts basierend auf dem Schlüssel
    public V get(K key) {
        int index = hash(key);
        LinkedList<Entry<K, V>> bucket = table[index];

        for (Entry<K, V> entry : bucket) {
            if (entry.key.equals(key)) {
                return entry.value;
            }
        }
        
        return null;
    }
    
    // Methode zum Entfernen eines Eintrags basierend auf dem Schlüssel
    public V remove(K key) {
        int index = hash(key);
        LinkedList<Entry<K, V>> bucket = table[index];

        for (Entry<K, V> entry : bucket) {
            if (entry.key.equals(key)) {
                V value = entry.value;
                bucket.remove(entry);
                return value;
            }
        }
        
        return null;
    }
}


Erläuterung der Implementierung:

1. Generische Deklaration: Die Klasse SimpleHT wird als generische Klasse mit den Typen K und V für Schlüssel und Werte definiert: public class SimpleHT<K, V>.

2. Innere Klasse Entry: Diese Klasse speichert die Schlüssel-Wert-Paare. Sie ist selbst generisch und auf die Typen K (Schlüssel) und V (Wert) parametrisiert.

3. Konstruktor: Der Konstruktor initialisiert die Hashtabelle mit einer Größe von m, indem er ein Array von LinkedList<Entry<K, V>> erstellt. Jede Position im Array wird mit einer neuen LinkedList initialisiert.

4. Hashfunktion: Die Methode hash(K key) berechnet den Hashwert des Schlüssels unter Verwendung der hashCode()-Methode und des Modulo-Operators. Der Ausdruck key.hashCode() & 0x7fffffff sorgt dafür, dass der Hashwert positiv ist.

5. Methoden:
- put(K key, V value): Fügt ein neues Schlüssel-Wert-Paar hinzu oder aktualisiert den Wert, wenn der Schlüssel bereits existiert.
- get(K key): Ruft den Wert für einen gegebenen Schlüssel ab oder gibt null zurück, wenn der Schlüssel nicht existiert.
- remove(K key): Entfernt den Eintrag für einen gegebenen Schlüssel und gibt den Wert zurück oder gibt null zurück, wenn der Schlüssel nicht existiert.

Diese Implementierung stellt eine einfache Hashtabelle mit Kollisionserkennung durch Verkettung (Chaining) bereit und kann für beliebige Typen K und V verwendet werden.
Avatar von

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community