Anzeige von Zeichen und wie oft erscheinen Sie?
Bekomme ich einen string aus der Benutzer-und dann legen Sie es in ein char-array. Nun möchte ich alle anzeigen der Zeichen in der Zeichenfolge, zusammen mit, wie oft Sie erscheinen. Mein code ist wie folgt, Bitte Korrigieren Sie mich ?
using System;
class count
{
public void charcount()
{
int i ;
int count = 0;
string s;
Console.WriteLine("Enter the String:");
s = Console.ReadLine();
char[] carr = s.ToCharArray();
for(i = 0; i < carr.Length; i++)
{
for(int j = 1; j < carr.Length; j++)
{
if(carr[j] == carr[i])
{
count++;
}
else
{
return;
}
Console.WriteLine("The Character " + carr[i] + " appears " + count);
}
}
}
static void Main()
{
count obj = new count();
obj.charcount();
}
}
- Ist dieses Hausaufgaben?
- Ist dieses Hausaufgaben? Wenn ja, bitte markieren Sie Sie als solche.
- Wie über Sie auflisten, was Sie wissen, falsch zu sein mit diesem code bisher, basierend auf der Ausgabe?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, Ihr code wird zumindest Probleme aufgrund der Tatsache, dass Sie nicht erstellen Sie eine Liste von einzigartigen Charakteren, finden Sie Sie in der original-string. Eine beliebige Zeichenfolge mit Zeichen, die mehrere Male angezeigt werden, zeigen seltsame Ergebnisse.
Hier einen LINQ-Ausdruck ermittelt die Informationen für Sie (Sie können laufen in LINQPad, um sofort die Ergebnisse zu sehen):
Ausgabe:
Wenn Sie nicht verwenden können, LINQ, hier ein Beispiel, in dem nicht dass:
Sieht es aus wie Sie möchten, dass eine äußere Schleife und eine innere Schleife, und für jeden char im array, die Sie vergleichen möchten jedem, der folgt, mit
int j = 1
. In diesem Fall möchten Sieint j = i + 1
in der inneren Schleife:Aber Ihre return-Anweisung beendet die Funktion rechts in der Mitte der Dinge. Sie müssen lassen Sie die Schlaufen abgeschlossen, so dass Sie entfernen möchten, dass
return
.Ihre
Console.WriteLine
führt bei jeder iteration der inneren Schleife, sondern Sie wirklich nur wollen, es zu Durchlaufen, die auf die äußere Schleife -- einmal für jedes Zeichen des Strings, und nicht einmal für jede Kombination von i und j ist. So müssen Sie drücken, dass die äußere Schleife, außerhalb der inneren Schleife.Außerdem müssen Sie zum zurücksetzen der Zähler jedes mal, wenn Sie beginnen, eine weitere iteration der äußeren Schleife, weil Sie das zählen wieder, und Sie möchten anfangen zu zählen bei 1 nicht null, wenn Sie finden Sie ein Zeichen, denn es erschien nur einmal, wie Sie zuerst erreichen.
Und Lasse Punkte heraus, bekommen Sie eine merkwürdige Ausgabe, wenn Sie auf die gleichen Zeichen, wie Sie bewegen sich entlang der äußeren Schleife. Eine einfache Möglichkeit um das zu verhindern, ist der weitere (rechts) char[j] mit '\0' (null-Zeichen) auf jedem Spiel, und dann in der äußeren Schleife, ignorieren null-Zeichen in Ihr zählen zum Beispiel mithilfe
continue
effektiv ausmerzen Ihnen, wie Sie entlang gehen:Mein Erster Gedanke wäre, wie man ein Wörterbuch benutzt, wie Daniel schon sagt, wie diese:
Aber ich mag die elegante LINQ-Lösungen.
Wenn Sie getestet haben würde, den code, Sie würde haben erkannt, dass der code ist sehr falsch.
Einige seiner Probleme:
count
variable, obwohl Sie wollen zählen Sie die vorkommen aller Zeichen im stringDer richtige Weg wäre, um eine
Dictionary<char, int>
zu halten, wird die Anzahl für jedes Zeichen, so etwas wie dieses:Ich nicht mit LINQ auf Zweck, denn ich glaube nicht, dass Sie verstehen würde, der code. Das ist keine straftat.
Wenn Sie gehen wollen, dass die LINQ-Weg, dies ist ein ziemlich kurzer Weg, es zu tun (die ich merke, ist so ziemlich das gleiche wie Lasse V. Karlsen Antwort, nur mit einer anderen syntax):
Die Logik ist die gleiche, was auch immer Ansatz Sie nutzen:
In meinem code-Beispiel,
s.GroupBy(c => c)
kümmert sich um die ersten beiden Schritte. Der AufrufOrderByDescending(g => g.Count())
wird einfach irgendwie das Ergebnis, so dass weitere häufige Zeichen kommen zuerst. Jedes element im Ergebnis hat einKey
Eigenschaft (des Charakters) und (unter anderem) eineCount()
Methode, wird wieder die Anzahl der vorkommen für diesen Charakter.