Buchstabenhäufigkeit mit Array und Ausgabe des häufigsten Buchstaben

Jakonfire

Mitglied
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.
 
Danke, habe die Schleife entfernt. Ist mein Ansatz für die Ermittlung der Häufigkeit so korrekt?

Java:
import java.io.*;
public class Buchstabenhaeufigkeit {
    public static void main(String[] args) {
  
    String zeichenkette = args[0]; //Text einlesen
    zeichenkette = zeichenkette.replaceAll(" ", "").toLowerCase();
    int merke = 0;
    int[] count = new int[26]; //Buchstaben Zählerarray

      
    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
        }
    }
}
 
Nein, ich wollte es nur richtig stellen. Du hast ein int Array, also in deinem Fall initial ein Array von Nullen. Die Schleife brauchst du nicht.
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')?
 
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("!","");
 
Zuletzt bearbeitet:
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);
}
}
}
 
Mit Modulo könntest du an dein Ziel kommen.
Modulo gibt dir den Rest einer Division.
Java:
int a = 10 % 4;
System.out.println(a);//2
so kann man dann erzwingen dass man in einem bestimmten Bereich bleibt.
Wenn ich zb x % y rechne, bekomme ich immer eine Zahl zwischen 0 und y -1
 
Von z bis g ebenfalls 7.
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:

'z' - 'g' = -19
-19 + 26 = 7
7 % 26 = 7

'c' - 'a' = 2
2 + 26 = 28
28 % 26 = 2
 
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:

'z' - 'g' = -19
-19 + 26 = 7
7 % 26 = 7

'c' - 'a' = 2
2 + 26 = 28
28 % 26 = 2
Danke an euch beide!
Fand ich auch strange, war aber so in den Antworten gewünscht und so funktioniert es 🙂
 

Zurück
Oben