Hi,
ich möchte ein kleines Programm schreiben, das in einem String (der der Einfachheit halber nur aus Kleinbuchstaben und Leerzeichen besteht)
die Häufigkeit der einzelnen Buchstaben zählt und die dann in einem Array speichert,
also die Häufigkeit von 'a' an der ersten Stelle usw. und die von Leerzeichen an der letzten.
Für a-z funktioniert das auch, aber für das Leerzeichen halt nicht und ich weiß nicht, wieso. Ich finde halt den Fehler nicht :/.
Könnte sich jemand das bitte angucken?
Java:
publicclassText{privatestaticint[] _anz;privatestaticString _s;publicText(String s){
_anz =newint[27];
_s = s;}publicstaticvoidzaehlen(){for(int i =0; i < _s.length(); i++){for(int j =0; j <27; j++){if((int) _s.charAt(i)==97+ j){
_anz[j]+=1;}if((int) _s.charAt(i)==32){
_anz[26]+=1;}}}}{}//zum Testenpublicstaticvoidmain(String[] args){newText(" ");zaehlen();for(int i =0; i <27; i++){System.out.print(_anz[i]);}// ergibt 0000000000000000000000000027}}
Dann spiel das doch einmal durch. Was passiert bei einem Leerzeichen?
Du hast eine Schleife von 0 bis einschliesslich 26 und in dieser Schleife prüfst Du jedes Mal: Ist es ein Leerzeichen um dann jedes Mal den zähler hoch zu zählen ...
Evtl. solltest Du Dir immer erst den Algorithmus im Detail überlegen und diesen dann exakt in Worten nieder schreiben. Das sollte es dir einfacher machen, den Algorithmus selbst durchzuspielen und Fehler zu finden.
So macht es bei so einem Ansatz doch mehr Sinn, da genauer zu unterscheiden Statt da eine Schleife zu haben, könntest Du es direkt per if Statements prüfen:
Du hast die Fälle:
a) das Zeichen ist >= 'a' und <= 'z'. Welcher Index da dann ist, kannst Du auch berechnen mit zeichen - 'a'
b) das Zeichen ist == ' '
c) alles Andere was ggf. als Fehler ausgegeben werden sollte.
(Hier der Hinweis: Statt magischer Zahlen wie 97 kannst Du auch char Literale verwenden wie 'a' oder ' ')
Das ist so nicht korrekt. Du willst ja prüfen 'a' <= zeichen <= 'z' und das hast Du nicht in der if Anweisung. (Da hast du zwei mal "<=" aber beim 'a' müsste es >= sein.
Und statt der Schleife um die Zeichen alle durchzuprüfen: ein char ist eine 16 Bit Zahl und Du kannst mit der Zahl auch rechnen. Du weisst, dass es eines der gewünschten Zeichen ist und Du weisst, dass gilt: zeichen = 'a' + index. Also kannst Du - statt alle indices auszuprobieren, dies doch berechnen: index = _s.charAt(i) - 'a'
Das wäre dann also etwas wie:
Java:
publicstaticvoidzaehlen(){for(int i =0; i < _s.length(); i++){if(('a'<= _s.charAt(i))&&(_s.charAt(i)<='z')){
_anz[_s.charAt(i)-'a']++;}elseif(_s.charAt(i)==' '){
_anz[26]+=1;}}}
Edit: Der Part mit dem >= war totaler Quatsch, wie vom TE richtig erkannt und bemerkt. Daher die direkte Anpassung. Sorry für die Verwirrung!
Sicher? Ich habe doch 'a' <= zeichen <= 'z'.
Wenn ich die erste Ungleichung umdrehe, ist ja ('a' >= _s.charAt(i)) && (_s.charAt(i) <= 'z') äquivalent zu 'a' >= _s.charAt(i), da <= transitiv ist und 'a' <= 'z' und dann ergibt die Bedingung keinen Sinn mehr dafür, was ich machen möchte. Ich möchte ja, dass in dem Fall zeichen zwischen a und z liegt.
In allen Testfällen funktioniert meine Variante aber, bei deiner bekomme ich eine IndexOutOfBoundsException.
Viele Grüße
Ja, Du hast Recht, da war ich irgendwie komplett neben der Spur. Da passiert wenn man während der Arbeit kurze Pausen für schnelle Blicke ins Forum nutzt und sich zu wenig Zeit nimmt. Deine beiden <= waren natürlich korrekt und ich streiche den Part bei meinen Posts noch. Sorry für die Verwirrung! Aber der Part mit der inneren Schleife sollte aber korrekt sein ...