# Array/Hashtable -Probleme



## marcels87 (19. Jan 2018)

Hallo zusammen,
ich bearbeite gerade ein Programm, dass zu ungefähr 80% fertig ist. Jetzt geht es nur noch um Fehlerbearbeitung und Ausgabe eines Hashtables: 
Die Aufgabe:

. Hashtabelle
Früher haben Sie sich mit einer Hash-Funktion für Strings beschäftigt. Schreiben Sie jetzt eine Klasse für Speicherobjekte(„Hash-Tabellen“),die die Funk-
tion benutzt, um Strings abzulegen und zu suchen. Objekte sollen die folgenden Komponenten haben:
Attribut (von außen nicht direkt zugreifbar):
•EinString-Array zur Speicherung von Wörtern.

• Konstruktor:
• Ein Konstruktor, der als Parameter die gewünschte Größe des Arraysenthält (und den Ar-
ray entsprechend erzeugt).

• Methoden:
•Eine Methode store(), die einen zu speichernden String als Parameter übergeben be-
kommt. Die Methode soll anhand der Hash-Funktion aus dem Arbeitsblatt „Methoden
und Arrays“den Hash-Wert dieses Stringsberechnen (wobei als Modulo m die Länge
des Arrays benutzt werden muss). Der Hash-Wert gibt die Position im Array an, an der
der übergebene String gespeichert werden soll. Ist die Position frei, so soll der String
dort abgelegt undein true zurückgeliefert werden. Ist die Position nicht frei (also im
Fall einer „Kollision“) soll er nicht gespeichert und ein false
zurückgeliefert werden.

• Eine Methode search(), die einen String übergeben bekommt. Befindet sich der String im Speicher, so soll seine Position zurückgeliefert werden, ansonsten der Wert -1.

• Eine Methode delete() , die einen String übergeben be kommt und diesen String löscht,
sofern er sich im Speicher befindet. Sie soll nichts zurückliefern. 

Schreiben Sie zudem ein Hauptprogramm, das eine Hash-Tabelle erzeugt und dann ein Auswahlmenü bietet, mit dem man wiederholt ihre verschiedenen Methoden aufrufen kan
n.

Mein Code sieht so aus: 


```
import java.io.*;


public class Hashneu {
 
  public static void main (String [ ] args ) throws IOException {
     boolean neustart = true;
     Hashneu meinHash;
     
   
BufferedReader in= new BufferedReader(new InputStreamReader(System.in));     
          System.out.println("Bitte geben Sie die Groesse des Arrays ein:");
          int size= Integer.parseInt(in.readLine());
         
         meinHash = new Hashneu(size);
     
        while (neustart) {
   
         
         
System.out.println("Bitte geben Sie den zu �bergenden String ein:");
String s1  = in.readLine();   
           
    System.out.println("Welche Methode m�chten Sie verwenden?");
    System.out.println("1. Store?");
    System.out.println("2. Search?");
    System.out.println("3. Delete?");
    System.out.println("Bitte geben Sie die entsprechende Zahl ein:");   
   
    int Auswahl = Integer.parseInt(in.readLine());

    if (Auswahl==1){    // Store
    boolean gespeichert = meinHash.Store(s1);
    if (gespeichert = true){
      System.out.println("Speichern erfolgreich");}
    else System.out.println("Position bereits belegt.");
    }
    else if (Auswahl ==2){    //Search
    int Stringposition = meinHash.search(s1);
    if (Stringposition == -1){
      System.out.println("String nicht im Array enthalten");}
    else {System.out.println("Position des Strings: " + Stringposition);
    }
     
    }
    else if (Auswahl ==3){     //Delete
      meinHash.delete(s1);
    }
   
    }
         System.out.println("M�chten Sie das Programm erneut starten? (j/n)");

            String sc2 = in.readLine();
            neustart = sc2.equalsIgnoreCase("j");
     
   
  }
    //------------------------------------------------------------------------------------------
   
  private String [ ] Array;
 
  Hashneu(int size){
   
   Array = new String [size];
     }
 
 
 boolean  Store(String s1)
      {   
          int summe = 0;
          int Hash=0;
          for (int i = 0; i < s1.length(); i++) {
             summe += s1.charAt(i);
             Hash = summe%(Array.length);
          }
             if (Array[Hash]!=null) {
             Array[Hash]= s1;
             return false;
             }else
             {Array[Hash]= s1;
               return true;
             }
             }
     


public int search(String s1){
for (int i =0; i<Array.length; i++) {
 if (s1.equals(Array[i])) {
 return i;}
}
return -1;
}

 


 void delete(String s1){
 for (int i =0; i<Array.length; i++) {
 
  if (s1.equals(Array[i])) {
   Array[i]=null;
  }
 }

}
 }
```

Das Programm lässt sich programmieren und ausführen, jedoch macht die Methode store Probleme. Wenn ich zweimal den gleichen String übergebe, müsste die Rückmeldung kommen, dass er nicht gespeichert werden kann da die Position bereits belegt ist. Es wird allerdings immer "Speichern erfolgreich" ausgegeben. 

Das Hauptprogramm soll eine Hashtabelle erstellen. Wie gebe ich diese aus? Ich gebe zu, dass die Beispiele im Internet mich eher verwirrt als geholfen haben. 

Ich wäre wirklich dankbar, wenn ihr mir ein wenig unter die Arme greifen könntet.

Besten Dank.


----------



## fhoffmann (19. Jan 2018)

if (gespeichert = true){
Dies ist eine Zuweisung und kein Vergleich!


----------



## mrBrown (19. Jan 2018)

marcels87 hat gesagt.:


> dass zu ungefähr 80% fertig ist


Diese Angabe trifft so gut wie immer zu 

Außerdem überschreibst du den schon vorhandenen String, wenn du einen mit gleichem Hash addest


----------



## marcels87 (19. Jan 2018)

@fhoffmann Oh Mann, wer lesen kann ist klar im Vorteil.  Besten Dank. 
@mrBrown Es funktioniert zumindest soweit, dass das Programm zurückgibt, dass die Position bereits belegt ist.

Was mir hauptsächlich Kopfzerbrechen bereitet ist die Sache mit dem Hashtable. So wie ich es verstanden habe ist der Hastable eine Tabellenartige Ausgabe des Arrays. Ich nehme an, dass mit Erstellung einer Hashtabelle die gleichzeitige Ausgabe des Hashtables gemeint ist. Ich weiss leider nicht, wie ich das umsetzen soll.


----------



## mrBrown (19. Jan 2018)

marcels87 hat gesagt.:


> Es funktioniert zumindest soweit, dass das Programm zurückgibt, dass die Position bereits belegt ist.


Allerdings ist damit die Aufgabenstellung nicht erfüllt ^^



marcels87 hat gesagt.:


> Was mir hauptsächlich Kopfzerbrechen bereitet ist die Sache mit dem Hashtable. So wie ich es verstanden habe ist der Hastable eine Tabellenartige Ausgabe des Arrays. Ich nehme an, dass mit Erstellung einer Hashtabelle die gleichzeitige Ausgabe des Hashtables gemeint ist. Ich weiss leider nicht, wie ich das umsetzen soll.


Deine Klasse *ist* die Hash-Table.

Ausgegeben werden muss da nichts weiter (oder überles ich da irgendwas?)


----------

