[C# ] Anfänger Problem mit string einlesen und Anzahl ausgeben

jack200

Grünschnabel
Hallo liebe Community,

ich soll ein Programm schreiben, das von einem eingelesenen string eine Tabelle ausgibt, mit allen Zeichen die im string vorkamen, zusammen mit den Anzahlen.

So sollte das dann z.B. aussehen:

String: BANANE

B 1
A 2
N 2
E 1

Ich bin mit C# noch nicht so gut vertraut und bräuchte deswegen eure Hilfe. Ich denke mal man muss den string mit Hilfe einer Schleife "durchlaufen" lassen, also mit stringname.Length halt, und dann die einzelnen Zeichen zählen, bei einem Zeichen wird nur eine 1 ausgegeben und wenn 1 Zeichen öfters vorkommt immer addiert halt, aber wie genau ich das jetzt schlussendlich in C# schreibe weiß ich nicht wirklich :/ Jmd. eine Idee oder einen Ansatz der mir weiterhelfen könnte?

Vielen Dank schonmal.

mfg Jack
 
Du könntest dir ein Dictionary-Objekt anlegen, in dem du als Wertepaar einen Buchstaben und dessen Häufigkeit speicherst.
Nun iterierst du, wie du schon selber vorgeschlagen hast, über die einzelnen Buchstaben im Vorgabe-String. Bei jedem Buchstaben prüfst du, ob das Dictionary diesen Buchstaben schon als Key kennt (ContainsKey-Methode). Wenn nicht, dann fügst du den Buchstaben als Key und die Zahl 1 als Wert hinzu (Add-Methode). Falls der Buchstabe bereits existierte, dann erhöhst du den zugeordneten Wert um 1.
Am Ende gibst du alle im Dictionary enthaltenen Wertepaare aus.
 
Zuletzt bearbeitet:
Hallo,

es gibt verschiedene Möglichkeiten um die Aufgabe zu lösen, wie das Beispiel von Shakie beschreibt, allerdings würde ich die ASCII-Tabelle heran ziehen, da hier jedem Alphanumerischen Zeichen eine Zahl zugeordnet werden kann, was vielleicht den Programmcode verlängert, aber meiner Meinung nach sauberer ist.

Selbst wenn du Anfänger bist, solltest Du dich mit der Ascii-Tabelle vertraut machen.

Im übrigen kannst Du die Ausgabe mit einer SortedList steuern, damit das Ganze sortiert nach Keys ausgegeben wird, also z.B. Alphabetisch.

Viele Grüße,

VScan
 
Ich hatte letztens eine ähnliche Aufgabe zu meistern, allerdings leicht abgeändert. Ich kann dir gerne meinen Code dafür zuschicken, jedoch habe ich nur geprüft, wieviele verschiedene Buchstaben in einem Wort bzw. Satz sind.

Mein Lösungsansatz dazu waren 2 For-Schleifen und ein Array.

Mich würde interessieren, wie du das am Ende dann gelöst hast und ich fände es gut, wenn du den Quellcode dann posten könntest.

Grüße
Hale
 
allerdings würde ich die ASCII-Tabelle heran ziehen
Also vielleicht überseh ich ja was aber ich finde es in diesem Fall mehr als unnötig die ASCII-Tabelle zu verwenden.
Hier gewinnt man dadurch doch keinen Vorteil. Im Gegenteil der Code wird unleserlicher und länger.

Ich kann dir gerne meinen Code dafür zuschicken, jedoch habe ich nur geprüft, wieviele verschiedene Buchstaben in einem Wort bzw. Satz sind.
Mein Lösungsansatz dazu waren 2 For-Schleifen und ein Array.
Das hättest du mit Distinct() auch ohne eine Schleife herausfinden können.
C#:
string sentence = "The quick brown fox jumps over the lazy dog";
int distinctCharCount = sentence.Distinct().Count();

Mich würde interessieren, wie du das am Ende dann gelöst hast und ich fände es gut, wenn du den Quellcode dann posten könntest.
Hier ist ein Beispiel wie man es mit Linq lösen könnte.
Es ist allerdings nicht wirklich Effizient.

C#:
string word = "BANANE";
          
Dictionary<char, int> occs = word.Distinct()
                                    .Select(x => new KeyValuePair<char, int>(x, word.Count(f => f == x)))
                                    .ToDictionary(k => k.Key, v => v.Value);
 
Das hättest du mit Distinct() auch ohne eine Schleife herausfinden können.

Vielen Dank, ich habe mir das ganze gerade mal angeguckt und das ist wirklich eine gute Lösung.

Hier ist ein Beispiel wie man es mit Linq lösen könnte.
Es ist allerdings nicht wirklich Effizient.


Code:
.Select(x => new KeyValuePair<char, int>(x, word.Count(f => f == x)))
.ToDictionary(k => k.Key, v => v.Value);

Leider verstehe ich das nicht so ganz... Woher kommen das x, f und v? Wie hast du sie deklariert?

Grüße Hale
 
Ich hatte letztens eine ähnliche Aufgabe zu meistern, allerdings leicht abgeändert. Ich kann dir gerne meinen Code dafür zuschicken, jedoch habe ich nur geprüft, wieviele verschiedene Buchstaben in einem Wort bzw. Satz sind.

Mein Lösungsansatz dazu waren 2 For-Schleifen und ein Array.

Mich würde interessieren, wie du das am Ende dann gelöst hast und ich fände es gut, wenn du den Quellcode dann posten könntest.

Grüße
Hale

Ich habe mich nicht weiter mit der Aufgabe beschäftigt, bin auf eine andere umgestiegen und habe deswegen keine Lösung sry.
 
Hallo,

Also vielleicht überseh ich ja was aber ich finde es in diesem Fall mehr als unnötig die ASCII-Tabelle zu verwenden.
Hier gewinnt man dadurch doch keinen Vorteil. Im Gegenteil der Code wird unleserlicher und länger.
Dass der Code länger wird habe ich bereits gesagt.
Von einem Vorteil durch kürzere Schreibweise stand nichts in meinem Post, ich sagte, dass die Struktur sauberer wäre, da ich Sonderzeichen und Groß-/Kleinschreibung im Gedanken hatte und jack200 nur etwas von Zeichen geschrieben hat.
Nun, dann habe ich das wohl falsch verstanden, tut mir leid.

C#:
string word = "BANANE";

Dictionary<char, int> occs = word.Distinct()
                                    .Select(x => new KeyValuePair<char, int>(x, word.Count(f => f == x)))
                                    .ToDictionary(k => k.Key, v => v.Value);
Als Beispiel für Anfänger ist das ungeeignet, denn die Literatur für "Linq" (das übrigens auch mit Sql-Anweisungen verwendet werden kann) und Lamda-Ausdrücke ist nicht gerade "kurz", die jack200 gleich im Post danach nachgefragt hat.

Du hast wohl die Stelle mit folgendem Satz aus versehen überlesen:
Ich bin mit C# noch nicht so gut vertraut und bräuchte deswegen eure Hilfe.

jack200 wollte anscheinend eine fertige Lösung haben, die hat er ja jetzt, auch wenn der Kode für Ihn unverständlich kürzer wurde. ;)

Aber um nicht nur zu meckern, sondern auch was produktives beizutragen, hier eine für Ihn verständlichere Lösung, allerdings werden Groß/Klein und Sonderzeichen eingeschlossen.

C#:
static void Main(string[] args)
{
    Console.WriteLine("Bitte geben Sie eine Zeichenfolge ein:");

    SortedList<char, int> myList = new SortedList<char, int>();

    // Konsolen-Eingabe erfassen.
    char[] myInputChars = Console.ReadLine().ToCharArray();

    // Eingabe verarbeiten.
    for (int i = 0; i < myInputChars.Length; i++)
    {
        // Leerzeichen ausschließen...
        if (myInputChars[i].Equals(' '))
            continue;

        // Wenn das Zeichen bereits in der Liste ist, Anzahl inkrementieren,
        // ansonsten hinzufügen.
        if (myList.Keys.Contains(myInputChars[i]))
            myList[myInputChars[i]]++;
        else
            myList.Add(myInputChars[i], 1);
    }

    // Ausgabe der Liste.
    for (int i = 0; i < myList.Count; i++)
    {
        Console.WriteLine("Key: " + myList.Keys[i].ToString() + " - Anzahl: " + myList.Values[i].ToString());
    }

    // Pausiere nach der Ausgabe.
    Console.ReadLine();
}

Viele Grüße
VScan
 

Neue Beiträge

Zurück