2016-04-06 12 views
1

In eigenen Hash-Tabelle in Java, aber ich muss eine Funktion entfernen Objekt mit Wert nicht Schlüssel zu entfernen.So bitte helfen Sie mir. Und ich Außerdem muss in einer separaten Funktion überprüft werden, ob ein bestimmter Wert in der Tabelle vorhanden ist oder nicht.

Hier ist mein Code:

Ich habe meine eigene Hash-Tabelle in Java implementiert, aber ich muss Objekt mit Wert nicht Schlüssel

import java.util.Scanner; 
class LinkedHashEntry 
{ 
    String key; 
    int value; 
    LinkedHashEntry next; 

    LinkedHashEntry(String key, int value) 
    { 
      this.key = key; 
      this.value = value; 
      this.next = null; 
    } 
} 
class HashTable 
{ 
    private int TABLE_SIZE; 
    private int size; 
    private LinkedHashEntry[] table; 

    public HashTable(int ts) 
    { 
     size = 0; 
     TABLE_SIZE = ts; 
     table = new LinkedHashEntry[TABLE_SIZE]; 
     for (int i = 0; i < TABLE_SIZE; i++) 
      table[i] = null; 
    } 
    public int getSize() 
    { 
      return size; 
    } 
    public void makeEmpty() 
    { 
      for (int i = 0; i < TABLE_SIZE; i++) 
       table[i] = null; 
    } 
    public int get(String key) 
    { 
     int hash = (myhash(key) % TABLE_SIZE); 
     if (table[hash] == null) 
       return -1; 
     else 
     { 
      LinkedHashEntry entry = table[hash]; 
      while (entry != null && !entry.key.equals(key)) 
      entry = entry.next; 
      if (entry == null) 
       return -1; 
      else 
        return entry.value; 
     } 
    } 
    public void insert(String key, int value) 
    { 
      int hash = (myhash(key) % TABLE_SIZE); 
      if (table[hash] == null) 
       table[hash] = new LinkedHashEntry(key, value); 
      else 
      { 
       LinkedHashEntry entry = table[hash]; 
       while (entry.next != null && !entry.key.equals(key)) 
       entry = entry.next; 
       if (entry.key.equals(key)) 
        entry.value = value; 
       else 
        entry.next = new LinkedHashEntry(key, value); 
      } 
      size++; 
     } 

     public void remove(String key) 
     { 
      int hash = (myhash(key) % TABLE_SIZE); 
      if (table[hash] != null) 
      { 
       LinkedHashEntry prevEntry = null; 
       LinkedHashEntry entry = table[hash]; 
       while (entry.next != null && !entry.key.equals(key)) 
       { 
        prevEntry = entry; 
        entry = entry.next; 
       } 
       if (entry.key.equals(key)) 
       { 
        if (prevEntry == null) 
         table[hash] = entry.next; 
        else 
         prevEntry.next = entry.next; 
         size--; 
       } 
      } 
     } 
     private int myhash(String x) 
     { 
      int hashVal = x.hashCode(); 
      hashVal %= TABLE_SIZE; 
      if (hashVal < 0) 
        hashVal += TABLE_SIZE; 
      return hashVal; 
     } 
     public void printHashTable() 
     { 
      for (int i = 0; i < TABLE_SIZE; i++) 
      { 
        System.out.print("\nBucket "+ (i + 1) +" : "); 
        LinkedHashEntry entry = table[i]; 
        while (entry != null) 
        { 
         System.out.print(entry.value +" "); 
         entry = entry.next; 
        }    
      } 
     } 
} 
public class Hash_tab 
{ 
    public static void main(String[] args) 
    { 
      Scanner scan = new Scanner(System.in); 
      System.out.println("Hash Table Test\n\n"); 
      System.out.println("Enter size"); 

      HashTable ht = new HashTable(scan.nextInt()); 

      char ch; 

      do  
      { 
        System.out.println("\nHash Table Operations\n"); 
        System.out.println("1. insert "); 
        System.out.println("2. remove"); 
        System.out.println("3. get");    
        System.out.println("4. clear"); 
        System.out.println("5. size"); 

        int choice = scan.nextInt();    
        switch (choice) 
        { 
        case 1 : 
        System.out.println("Enter key and value"); 
        ht.insert(scan.next(), scan.nextInt()); 
        break; 

        case 2 :     
        System.out.println("Enter key"); 
        ht.remove(scan.next()); 
        break;       

        case 3 : 
        System.out.println("Enter key"); 
        System.out.println("Value = "+ ht.get(scan.next())); 
        break;         

        case 4 : 
        ht.makeEmpty(); 
        System.out.println("Hash Table Cleared\n"); 
        break; 

        case 5 : 
        System.out.println("Size = "+ ht.getSize()); 
        break;   

        default : 
        System.out.println("Wrong Entry \n "); 
        break; 
       } 

       ht.printHashTable(); 

       System.out.println("\nDo you want to continue (Type y or n) \n"); 
       ch = scan.next().charAt(0);       
      } while (ch == 'Y'|| ch == 'y'); 
     } 
} 
+1

Hash-Tabellen sind schlüsselbasierte Datenstrukturen zu tun - der Wert ihrer Struktur grundsätzlich irrelevant ist. Wenn Sie nach Wert entfernen möchten, müssen Sie alle Einträge iterieren. –

Antwort

0

ich die einzige effiziente Art und Weise denken Sie eine andere Zuordnung von <value, List<Keys>> is- halten zu tun. Wenn Sie einen Wert entfernen müssen, entfernen Sie die Einträge für alle Schlüssel, die in der anderen Tabelle enthalten sind.

Andernfalls gibt es kein Entweichen vom vollständigen Scan.

0

Hashtables funktionieren nicht so. Das Holen (und daher Löschen) eines Wertes mit seinem Schlüssel ist das, was Hashtabellen sind. (Ich kann nicht sehen, wie Sie Ihre Hashtable implementiert haben, ich denke, es ist ein Array). Sie haben durch das Array zu durchlaufen und

  • alle
  • das erste Vorkommen

wieder löschen: Eine Hashtable entweder die falsche Struktur oder falsch verwendet werden könnten. Entweder Schlüssel und Wert umschalten (was auch für mehrere Werte möglich ist). Ihr HashMap<Integer,Integer> wird ein HashMap<Integer,List<Integer> sein, aber so wie Sie es brauchen.

PS: Mindestens in Java 8 ist es ‚einfach‘ mit den eingebauten in HashMap (JavaDoc)

+0

Ich verstehe Ihren Punkt.Aber ich bin verpflichtet, nicht die eingebaute hashmap zu verwenden ... Ich muss meine eigene Hash-Tabelle – Abhradip

+0

Sie können immer noch die gleiche Taktik verwenden .... Es ist nur die Idee, die ich Ihnen geben möchte :) –