Zeichen-Zähler in Java
Bisher dies ist, was ich versucht habe:
public class CharacterCounter {
public static void main(String[] args){
String string = "sashimi";
int count = 0;
for(int i =0; i < string.length(); i++){
if(string.charAt(i) == 'i'){
count++;
}
}
System.out.println("The number of letter i is " + count);
}
}
Ausgabe:
The number of letter i is 2
Aber was ich tun möchte, ist, das Programm rechnen soll, die aufgetreten sind Zeichen.
Zum Beispiel hier der string ist SASHIMI, die Ausgabe sollte sein:
the number of letter S is 2
the number of letter I is 2
Bin ich stecken mit diesem problem. Ich brauche Eure Hilfe. Danke.
- Sollten Sie eine
HashMap <Character, Integer>
. Der Schlüssel ist ein Zeichen. Der Wert ist die Anzahl des Auftretens. - Vielleicht sollten Sie verwenden irgendeine Art von Karte, an dem das Zeichen ist der Schlüssel und seine Frequenz ist der Wert. Sie können dann Durchlaufen Sie die Karte und finden Sie die Tasten mit den höchsten Werten.
- Ein
int[1<<16]
tun würde, als auch, und weit mehr performant. Rasend schnell, in der Tat. - Sie können detail? Ich verstehe nicht, was es tut.
- Siehe meine Antwort unten.
- Siehe stackoverflow.com/questions/6100712/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wäre dies der Schnellste Weg:
(ich habe gerade skizziert die Rolle, die iteriert über alle deine chars, ich glaube, das ist der einfache Teil, und nicht direkt auf diese Frage beziehen).
Benchmark-Ergebnisse
Habe ich entkernt die
HashMap
Ansatz gegen mine mit drei string-Längen:- Und das sind die Ergebnisse:
Was bedeuten Sie? Ja, die Initialisierung einer vollen 512K-block im Speicher auf null, ist teuer. Aber danach ist bezahlt, meine array-Algorithmus kaum noch bemerkt, dass sich die tausenden von Zeichen, die sausen durch. Die
HashMap
Ansatz, auf der anderen Seite, ist viel schneller für sehr kurze strings, sondern Skalen dramatisch schlechter. Ich denke, die Frequenzweiche ist bei über 2k string-Länge.Ich nehme an, es wird nicht bestritten, dass solche Charakter-count Statistiken sind in der Regel gegen massiven Korpora, und nicht Sachen wie Ihren vor-und Nachnamen.
Natürlich die Leistung der array-Ansatz kann wesentlich verbessert werden, wenn man davon ausgehen kann, dass nicht die komplette UTF-16 codepoint-Bereich verwendet werden. Zum Beispiel, wenn Sie ein array verwenden, dass bringt nur die untersten 1024 codepoints, die Leistung steigt auf 470 ops/msec.
HashMap
ist ein Komplexes Objekt, das die Bedürfnisse der Initialisierung. Nicht zu schweigen von all den arbeiten, die notwendig sind, um zu behaupten, dass der HashMap. Ich bin der Annahme der Herausforderung und testen diese aus.<<
es ist der shift-operator. In einfach Wort zu sagen verschieben 1 sechzehn mal nach Links. Dies wird produzieren 1_0000_0000_0000_0000, der gleich 65536 sein.Ich glaube, dass die Verwendung von primitiven wäre schneller als mit
HashMap
. Dies funktioniert:Ausgabe:
Wie bereits erwähnt in den Kommentaren, ein
HashMap
scheint ideal für diese, obwohl ich nicht geben Ihnen den direkten code, ich werde Ihnen eine pseduo-code-Vorlage.Dies wird Ihnen eine hashmap aller Buchstaben, zugeordnet der Höhe der Zeit, die Sie im Wort erscheinen. Nach Ihrer Beispiel:
Ich schlage vor, Sie erstellen ein TreeSet und dann kann man eine neue Klasse, die speichert das Zeichen und die Anzahl der vorkommen, dann kannst du diese Klasse ein compareTo, das überprüft, das Ereignis und eine equals überprüft den char. Dann, wenn Sie fügen Sie Sie in das treeset Sie werden immer in der Reihenfolge der je erschien den meisten.
Bitte lassen Sie mich wissen, wenn Sie Hilfe benötigen, oder wenn Sie es herausfinden mit diesen Informationen 🙂
EDIT: sobald Sie gefüllt haben, das TreeSet mit allen Buchstaben, alles, was Sie tun müssen ist, starten bekommen Sie aus 1 von 1, bis die occcurence von die, die Sie nahm weniger als die, die Sie nahm, bevor Sie (dh, wenn die top-3 Briefe erschienen 3 mal und das vierte 2, Sie zeigt nur die ersten 3).
müssen Sie ein
HashMap
zu halten, die meisten wiederholt chars mit der Zeit wiederholen und drucken Sie es.arrayLists
oder einehashmap
je nachdem, was Sie tun wollen,HashMap
hat overhead versucht aber schneller.Was Sie tun müssen, ist das literal (string). Und freuen über jeden char der es und stellen Sie es auf die richtige Eimer. In anderen Worten: Sie brauchen, um Sie zu gruppieren.
Konnten Sie erstellen einen bucket für jeden Buchstaben des Alphabets. Dann könnte man die Stelle der char in der richtigen Eimer und am Ende zählen Sie die Elemente, um die Antwort.
Siehe Marko Antwort, dass Sie dies tun.
Andere Möglichkeit ist, dass Sie die Art Ihre wörtliche
AHIIMSS
dann über einfach loop Sie werden in der Lage sein zu schreiben, die Ergebnisse.Die Methode, die Sie wählen, hängt das Ergebnis Sie brauchen, zu bekommen. Wenn Sie brauchen, um herauszufinden, wie viele der einzelnen Buchstaben Geschirr mit in word, dann Sortieren Optionen-Flut, wenn Sie brauchen, um wählen nur die maximale Buchstaben, dann die Lösung mit den Eimern ist mehr nützlich.
import java.util.*;
public class CharacterCounter {
public static void main(String[] args){
}
}
Eingang:-
Geben Sie Ihre Zeichenfolge Ein: Manash
Geben Sie ein Zeichen: ein
Ausgang:- 2
*/
Können Sie auch das Muster und Matcher :