Autor Beitrag
FMMarkus
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 04.01.08 21:54 
Hey,
ich möchte eine Textdatei auslesen und in dieser die Anzahl der einzelnen Buchstaben zählen. Dies habe ich auch geschafft. Auch mit Hashtabellen.
Meine Problem besteht jetzt darin, ich soll der Hashtabelle eine größe geben (h(i)=i mod Size). Wie soll dies gehen?
Und ich soll jedem Buchstaben des Alphabets einen Schlüssel geben. Wie soll dies gehen?
Kann mir dabei jemand helfen?
Danke im Voraus.
Hier mein Quellcode schon mal:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;

namespace ConsoleApplication1
{l
    class Program
    {
        static void Main(string[] args)
        {
            FileStream fs = new FileStream("D:/test.txt", FileMode.Open, FileAccess.Read);
            StreamReader sr = new StreamReader(fs);
            string satz = sr.ReadToEnd();
            satz = satz.ToLower();


            Hashtable ht = new Hashtable();
            string repspace = satz.Replace(" """);
            foreach (char buchs in repspace)
            {
                string strbuchs = Convert.ToString(buchs);
                if (!ht.Contains(strbuchs))
                {
                    ht[strbuchs] = 1;
                }
                else
                {
                    ht[strbuchs] = ((int)ht[strbuchs]) + 1;
                }
            }

            String[] astrWords2 = new String[ht.Keys.Count];
            ht.Keys.CopyTo(astrWords2, 0);
            Array.Sort(astrWords2);
            Int32[] htvalues = new Int32[ht.Values.Count];
            Array.Sort(htvalues, astrWords2);
            foreach (String buchs in astrWords2)
            {
                Console.WriteLine("{0,-2} = {1,2}", buchs, ht[buchs]);
            }
        }
    }
}


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Fr 04.01.2008 um 21:06
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 05.01.08 12:18 
user profile iconFMMarkus 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...

user profile iconFMMarkus 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:
ausblenden C#-Quelltext
1:
2:
ht.Add('a'0);
ht.Add('b'0); // usw.

Damit Du nicht (255-32) einzelne Zeilen schreiben musst (unter Unicode eigentlich 65000), kannst Du das mit einer Schleife Char.MinValue bis Char.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:
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
//  bisher:
ht[buchs] = ((int)ht[buchs]) + 1;
//  stattdessen:
dict[buchs] += 1;


Viel Erfolg! Jürgen
FMMarkus Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 08.01.08 16:09 
Titel: Danke für die TippS
Hallo,

danke für die Hilfe.
Hab es hinbekommen.

Danke für die Mühe!