FMMarkus hat folgendes geschrieben: |
Meine Problem besteht jetzt darin, ich soll der Hashtabelle eine größe geben (h(i)=i mod Size). Wie soll dies gehen? |
Das mit "mod Size" verstehe ich überhaupt nicht. (Das hängt wohl mit den Zugriffsmöglichkeiten zusammen und wie lange es dauert, bis ein bestimmter Wert gefunden wird; aber mit diesen Interna habe ich mich nicht beschäftigt.) Vielleicht ist das gemeint:
Wenn Du in die
SDK-Doku (die sollte sowieso das wichtigste Hilfsmittel sein, vor allen Foren) unter
Hashtable schaust, findest Du u.a. auf der Startseite in den "Hinweisen" etwas zur "Kapazität". Offensichtlich gibt es aber keine Eigenschaft Capacity; also muss man suchen, in welchem Zusammenhang so etwas festgelegt werden könnte. Etwa am Anfang? Wie wäre es also mit dem Konstruktor? Was für ein Wunder; dazu gibt es unter mehreren Überladungen auch:
Zitat: |
Hashtable (Int32)
Initialisiert eine neue leere Instanz der Hashtable-Klasse unter Verwendung der angegebenen Anfangskapazität... |
FMMarkus hat folgendes geschrieben: |
Und ich soll jedem Buchstaben des Alphabets einen Schlüssel geben. Wie soll dies gehen? |
Dazu trägst Du am Anfang - vor dem Auszählen der Textdatei - alle Buchstaben mit der bisherigen Anzahl ein:
C#-Quelltext
1: 2:
| ht.Add('a', 0); ht.Add('b', 0); |
Damit Du nicht (255-32) einzelne Zeilen schreiben musst (unter Unicode eigentlich 65000), kannst Du das mit einer
Schleife Char.MinValue bis C
har.MaxValue machen.
Übrigens empfehle ich anstelle einer Hashtable eine
Dictionary<char, int>. Von der Funktionalität her gleichen sich beide Klassen; aber beim Dictionary sind die Typen char und int bereits per Compiler vorgegeben. (Wahrscheinlich akzeptiert das Deine Aufgabenstellung nicht, aber so als Anregung...)
Nachtrag 1: Warum konvertierst Du eigentlich jeden einzelnen Buchstaben in einen String? Du kannst doch direkt zuordnen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| foreach (char buchs in repspace) { if (!ht.Contains(buchs)) ht[buchs] = 1; else ht[buchs] = ((int)ht[buchs]) + 1; } |
Nachtrag 2: Auf das Replace() für die Leerzeichen würde ich verzichten; das kostet nur Zeit durch kompliziertes Umspeichern des Strings. Viel einfacher ist es, jedes Zeichen ' ' beim Zählen einfach zu übergehen.
Nachtrag 3: Auch das Zählen geht mit einem Dict. einfacher; denn mit der Hashtable musst Du jede bisherige Summe konvertieren:
C#-Quelltext
1: 2: 3: 4:
| ht[buchs] = ((int)ht[buchs]) + 1; dict[buchs] += 1; |
Viel Erfolg! Jürgen