Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Buchstabenhäufigkeit mit Array und Ausgabe des häufigsten Buchstaben
Hallo, vielleicht kann jemand helfen. Das Programm soll einen String auf die Häufigkeit der einzelnen Buchstaben überprüfen und den am häufigsten vorkommenden Buchstaben ausgeben. Es gibt aber leider am Ende nicht den korrekten Index des häufigsten Zeichens aus.
Java:
import java.io.*;
public class Buchstabenhaeufigkeit {
public static void main(String[] args) {
String zeichenkette = args[0];
zeichenkette = zeichenkette.replaceAll(" ", "").toLowerCase();
//System.out.print(zeichenkette);
int merke = 0;
int[] count = new int[26];
for(int i = 0; i < 26; i++){ //Initialisieren mit 0
count[i] = 0;
}
for (int j = 0; j < zeichenkette.length() -1; j++) {
char aktuellerbuchstabe = zeichenkette.charAt(j);
if(aktuellerbuchstabe >= 'a' || aktuellerbuchstabe <= 'z'){
count[(aktuellerbuchstabe - 'a')]++; //Den Wert im Zählerarray erhöhen
}
}
for(int k = 0; k < 25; k++){
if (count[k] >= merke){
merke = k;
}
}
System.out.print(merke);
//System.out.print(merke+'a');
}
}
Dein Code ist sehr schwer nachzuvollziehen.
Evlt probierst du erstmal eine Methode umzusetzen um die Häufigkeit eines bestimmten Buchstaben zu ermitteln und baust darauf weiter auf.
Kleiner Tipp: Die int Werte in deinem Array werden wie in jedem anderen Objekt auch schon mit 0 initialisiert, brauchst dafür also nicht eine Extra schleife.
Die Aussage finde ich etwas fragwürdig Objekte in Arrays werden mit null initialisiert, numerische primitive Datentypen mit null und boolean mit false.
Die Aussage finde ich etwas fragwürdig Objekte in Arrays werden mit null initialisiert, numerische primitive Datentypen mit null und boolean mit false.
Okay. Also ich gehe den String vom ersten bis letzten Zeichen durch. Weise das jeweilige aktuelle Zeichen der Hilfsvariable zu. Dann schaue ich ob ob es jeweils größer gleich "a" oder kleiner gleich "z" ist. Wenn ja dann zähle ich im Array den int wert hoch (wert vom aktuellen buchstaben - 'a')?
Die Aussage finde ich etwas fragwürdig Objekte in Arrays werden mit null initialisiert, numerische primitive Datentypen mit null und boolean mit false.
Was soll merke sein? Die bisher größte Zahl oder der Index der bisher größten Zahl.
Du mischt hier die Bedeutungen und solltest stattdessen zwei unterschiedliche Variablen nutzen.
Was soll merke sein? Die bisher größte Zahl oder der Index der bisher größten Zahl.
Du mischt hier die Bedeutungen und solltest stattdessen zwei unterschiedliche Variablen nutzen.
Ich dachte ich kann damit überprüfen ob der gemerkte Index größer ist als der Index der aktuell in der for Schleife durchlaufen wird. Und wenn er es nicht ist wird der neue übernommen. Wären hier zwei Variablen besser?
Ich dachte ich kann damit überprüfen ob der gemerkte Index größer ist als der Index der aktuell in der for Schleife durchlaufen wird. Und wenn er es nicht ist wird der neue übernommen.
Was @fhoffmann meint ist, dass du mit count[k] >= merke einen Wert an einem Index mit einem Index vergleichst. Du willst aber eigentlich zwei Werte vergleichen, also count[merke]
Was @fhoffmann meint ist, dass du mit count[k] >= merke einen Wert an einem Index mit einem Index vergleichst. Du willst aber eigentlich zwei Werte vergleichen, also count[merke]
Danke, das funktioniert soweit. Bei den Testfällen sind aber auch strings mit Sonderzeichen (! und #) dabei und ein String mit nur einem Zeichen. Bei diesen Varianten gibt es noch nicht den korrekten Buchstaben aus.
Habe versucht diese zu entfernen aber dann schlägt die Ausgabe bei denen ohne Sonderzeichen fehl:
zeichenkette = zeichenkette.replaceAll("#",""); zeichenkette = zeichenkette.replaceAll("!","");
So hat alles funktioniert. Jetzt soll ich aber noch den Abstand zu einem in einem zweiten String übergebenen Zeichen ermitteln. Funktioniert aber nur wenn dabei z nicht überschritten wird. Wie schaffe ich es das dann wieder bei a angefangen wird?
Java:
import java.io.*;
public class Buchstabenhaeufigkeit {
public static void main(String[] args) {
String zeichenkette = args[0];
String abstand = args[1];
zeichenkette = zeichenkette.replaceAll("[^a-zA-Z]", "").toLowerCase();
int merke = 0;
char ausgabe;
int[] count = new int[26];
for (int j = 0; j < zeichenkette.length(); j++) {
char aktuellerbuchstabe = zeichenkette.charAt(j);
if(aktuellerbuchstabe >= 'a' || aktuellerbuchstabe <= 'z'){
count[(aktuellerbuchstabe - 'a')]++; //Den Wert im Zählerarray erhöhen
}
}
for(int k = 0; k < 26; k++){
if (count[k] >= count[merke]){
merke = k;
}
}
merke = merke+'a';
ausgabe = (char)merke;
System.out.println(ausgabe);
for (int h = 0; h < abstand.length(); h++) {
char Buchstabe = abstand.charAt(h);
System.out.println(ausgabe - Buchstabe);
}
}
}
Ok das finde ich strange, hätte hier eher 19 erwartet. Aber gut. Du wirst dann wie @DrPils schon meinte mit Modulo arbeiten müssen (außer du vergleichst dir Buchstaben vorab und addierst 26 nur zur Differenz, falls die Differenz negativ ist).
Um bei den Beispielen zu bleiben:
Ok das finde ich strange, hätte hier eher 19 erwartet. Aber gut. Du wirst dann wie @DrPils schon meinte mit Modulo arbeiten müssen (außer du vergleichst dir Buchstaben vorab und addierst 26 nur zur Differenz, falls die Differenz negativ ist).
Um bei den Beispielen zu bleiben: