Anzahl verschiedener Buchstaben im String

Heinrich500

Bekanntes Mitglied
Hallo,
ich will ein Programm schreiben, das einen String einliest und prozentual angibt, wie oft ein bestimmter Buchstabe vorkommt. Dabei soll zwischen Groß-und Kleinbchstaben nicht unterschieden werden.
Das habe ich so erstmal geschafft:
Java:
public static void main(String[] args){
           
       
        Scanner s=new Scanner(System.in);
            
        double counter =0;
        byte[] eingabe = new byte[200];
        int[] anzahlBuchstaben = new int[26];
        String[] Buchstaben=new String[] {"A","B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S","T" ,"U", "V", "W", "X", "Y", "Z"};
       
       
        String text= s.nextLine();
        eingabe = text.getBytes();


        for (int i = 0; i < eingabe.length; i++)
            if (eingabe[i]>90) eingabe[i]-=32;         // Alle Buchstaben in Großbuchstaben umwandeln
                                                                            

        for (int i = 0; i < eingabe.length; i++)    //Anzahl der im eingelesenen Wort enthaltenen Buchstaben alphabetisch im Array
            anzahlBuchstaben[(eingabe[i]-65)]++;   
   
   
        
       
        for(int i=0; i<anzahlBuchstaben.length; i++)
            if(anzahlBuchstaben[i] !=0) counter+= anzahlBuchstaben[i];
       
        for(int i=0; i<anzahlBuchstaben.length; i++) {
            if(anzahlBuchstaben[i] !=0) {
                System.out.println(Buchstaben[i] + ": " + anzahlBuchstaben[i] + " (" + Math.round((anzahlBuchstaben[i]/counter)*100) + "%)" );
            }
        }
        }
   
}

Eingabe:Hallo
Ausgabe:
A: 1 (20%)
H: 1 (20%)
L: 2 (40%)
O: 1 (20%)

Wenn ich aber jetzt einen String mit Leerzeichen oder Ausreufezeichen eingeben will, dann bekomme ich einen outofindex Error. Was muss ich an meinem Programm ändern, damit er diese Nichtbuchstaben ignoriert?
 

Heinrich500

Bekanntes Mitglied
Hallo, das ist die Fehlermeldung:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -32
at Buchstaben.main(Buchstaben.java:25)
bei Eingabe von Hallo!
 

Heinrich500

Bekanntes Mitglied
Ja ich gebe Buchstaben ein und bestimme dann anteilig wie oft der Buchstaben in dem Wort vorkommt. Wenn ich jedoch nicht nur Buchstaben sondern Leerzeichen, Fragzeichen usw eingebe, soll er diese ignorieren und nur die Buchstaben zählen.
Wo genau soll ich das prüfen mit dem isLetter?
 

VfL_Freak

Top Contributor
sehe gerade, dass Du ja einen ganzen String einliest (war aufgrund Deiner Variablennamen von einzelnen Buchstaben ausgegangen ...)

zuerst einmal: da Du ja einen String hast nach den Einlesen, kannst Du ihn ganz ein mit
Java:
String text= s.nextLine();
text.toUpperCase();
in Großbuchstaben umwandeln!
Danach läufst Du über diesen String (Stichwort: charAt(i)) und prüfst/zählst jedes Zeichen wie gewünscht !

VG Klaus
 

Heinrich500

Bekanntes Mitglied
Dann hätte ich mir das Ascii-Umwandeln in Großbuchstaben doch sparen können :)
Wenn ich mit charAt drüber gehe, woher weis ich dann später wie viel Buchstaben es von jeder Sorte gibt?
 

Heinrich500

Bekanntes Mitglied
Wie woher? Von welcher Klasse?
Ich habe sie einfach ins Programm geschrieben. Ich habe gedacht, dass diese schon irgendwie verebt wird. Aber das ganze Thema hatten wir noch nicht. Deshalb weis ich es nicht so genau.
 

Robat

Top Contributor
Die von mir oben genannte statische Methode stammt aus der vordefinierten Klasse Character.
Java:
char c = 'a' ;
if(Character.isLetter(c)){
  ... 
}
 

Heinrich500

Bekanntes Mitglied
Aso danke:) Ich hätte noch eine andere Frage. Ich habe in meinem Programm ein Array mit dem Alphabet manuell initialisiert. Wie kann man das effizienter machen. Tut mir leid für die späte Antwort.
 

Robat

Top Contributor
Okay jetzt weiß ich wozu du das ganze brauchst. Es gäbe schon andere Wege das Array zu initialisieren - aber lohnt sich das wirklich?

Ich würde dir vorschlagen dir mal das Map-Interface anzuschauen (konkret zB: HashMap).. Damit kannst du den Buchstaben auf die Anzahl "mappen"
 

mihe7

Top Contributor
@Robat ich glaube, Moxxi meinte das andersrum: wenn er nur die a-z zählen will, dann wird er sich mit isLetter hart tun, weil dort auch für andere Zeichen true zurückgegeben wird.

Die Map funktioniert natürlich immer -> laaaangweilig ;) Viel interessanter ist es doch, auf Arrays zu arbeiten.

@Heinrich500 Wenn Du wirklich nur a-z haben willst, wird die Sache sehr einfach. Dazu brauchst Du nur ein int-Array der Länge 26. Für das jeweilige Zeichen kannst Du einerseits einfach prüfen, ob es zwischen 'a' und 'z' liegt. Andererseits kannst Du durch Subtraktion von 'a' vom betreffenden Zeichen den Index im int-Array direkt berechnen (perfektes Hashing): int ix = ch - 'a'.

Wenn Du beliebige Buchstaben zählen willst, solltest Du mit Character.isLetter() filtern. Das Problem ist aber, dass im Zeichensatz nicht alle Buchstaben aufeinander folgen und durch die eben gezeigte Umrechnung große Lücken entstehen würden. Würdest Du wie eben ein int-Array verwenden, würde das verbraucht viel Platz verschwenden. Die Ausgabe wäre zeitlich auch nicht besonders effizient.

Eine andere Möglichkeit besteht nun darin, die Zeichen des Strings zu sortieren, dann kann die Häufigkeit der Buchstaben einfach der Reihe nach ausgegeben werden. Beispiel:

1. Ausgangstext: "HL. ABEND IST AM 24. DEZEMBER"
2. nur Buchstaben: "HLABENDISTAMDEZEMBER"
3. sortiert: "AABBDDEEEEHILMMNRSTZ"
4. der Reihe nach gezählt: 2 x A, 2 x B, 2 x D, 4 x E, ...
 

Heinrich500

Bekanntes Mitglied
Hallo, ich habe nochmal überlegt und habe jetzt folgendes Programm, was noch nicht ganz funktioniert:
Java:
import java.util.Scanner;
public class Buchstabenausgeben {
   
   
   
    public static void main (String [] args) {
       
        Scanner s=new Scanner(System.in);
       
        String text=s.nextLine();
        int []  anzahl=new int[26];
        int buchstabeninsgesamt=0;
       
       
       
        text=text.toUpperCase();
       
       
        for(int i=0; i<text.length(); i++) {
            if('A' <=text.charAt(i) && text.charAt(i) <= 'Z') {
                anzahl[text.charAt(i)-'A']+=1;
                buchstabeninsgesamt++;
            }
        }
        for(int i=0; i<text.length(); i++) {
            if(anzahl[i]!=0) {
                System.out.println((char)('A' +i) + ": " + anzahl[i] + Math.round(anzahl[i]/buchstabeninsgesamt) +" %");
               
            }
        }
       
    }

}

Hast du es so änhlich gemeint mihe7?
Tut mir leid, dass ich mich erst jetzt melde.
 

MoxxiManagarm

Top Contributor
Sie doch schon ganz gut aus :) was funktioniert denn noch nicht? Ich würde vermuten die Ausgabe ist noch nicht ok. Anzahl/gesamt ist immer eine Zahl zwischen 0 und 1. Du musst das Ergebnis noch mit 100 multiplizieren um die prozentual zu erhalten.
 

Heinrich500

Bekanntes Mitglied
Hallo, vielen Dank MoxxiManagarm:)
Also wenn ich z.b hallo! eingebe, erhalte ich nur als Ausgabe:
A: 10 %
Der Rest fehlt. Das muss an der 2. for-Schleife irgendwo liegen, denn die 1. wird wegen buchstabeninsgesamt=5 durchlaufen.
Wie du auch feststellst, habe ich am Ende eine Zahl zwischen 0 und 1. Es kommt aber trotzdem die richtige Zahl mit 10 % heraus ohne nochmals mit 100 zu multiplizieren. Weist du der Fehler liegt?
 

MoxxiManagarm

Top Contributor
1. A Kommt 1x vor. Deine division gerundet ergibt 0. String-concatiniert ergibt das 10. Daher 10%.

2. Die 2. Schleife durchläufst du abhängig von der Größe des Text. Für Hallo also von 0..4 da Hallo die Länge 5 hat. Bei Hallo hat nur a den Index im Bereich 0..4. A wird daher ausgegeben. Die 2. Schleife muss abhängig der Länge des Anzahl Array durchlaufen werden.
 

Heinrich500

Bekanntes Mitglied
Ich habe es jetzt so geändert.
Java:
import java.util.Scanner;
public class Buchstabenausgeben {
 
 
 
    public static void main (String [] args) {
    
        Scanner s=new Scanner(System.in);
    
        String text=s.nextLine();
        int []  anzahl=new int[26];
        double buchstabeninsgesamt=0;
        text=text.toUpperCase();
    
    
        for(int i=0; i<text.length(); i++) {
            if('A' <=text.charAt(i) && text.charAt(i) <= 'Z') {
                anzahl[text.charAt(i)-'A']+=1;
                buchstabeninsgesamt++;
            }
        }
        for(int i=0; i<anzahl.length; i++) {
            if(anzahl[i]!=0) {
                System.out.println((char)('A' +i) + ": "  + anzahl[i] + " "+ "Math.round((anzahl[i]/buchstabeninsgesamt)*100.0) +" %");
            
            }
        }
    
    }

}
Ich habe auch buchstabeninsgesamt zu double gemacht. Geht das einfacher?

Edit: Ich könnte auch int lassen. Dann würde
Java:
Math.round((anzahl/(double)buchstabeninsgesamt)*100.0)
auch funktionieren.
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
Wer will, kann's auch so machen:
Java:
import static java.lang.Character.toUpperCase;
import static java.util.stream.Collectors.*;
import static java.util.function.Function.identity;
import java.util.*;

Scanner s = new Scanner(System.in);
Map<Character, Long> absoluteCounts = s
    .nextLine()
    .chars()
    .sorted()
    .mapToObj(c -> (char) toUpperCase(c))
    .collect(groupingBy(identity(), LinkedHashMap::new, counting()));
Map<Character, Double> relativeCounts = absoluteCounts
    .entrySet()
    .stream()
    .collect(toMap(Map.Entry::getKey, v -> v.getValue() * 100.0 / absoluteCounts.size()));
System.out.println(absoluteCounts);
System.out.println(relativeCounts);
 

Oneixee5

Top Contributor
Du kannst einfach mit einem try-catch-Block die ArrayIndexOutOfBoundsException abfangen und das Zeichen z.B.: in der Kategorie Sonderzeichen zählen.
 

mihe7

Top Contributor
Wenn ich die Buchstaben dann sortiert habe, wie genau kann ich dann ausgeben, dass ein Buchstabe x mal vorkommt. Ich verstehe die Idee, aber wie geht das algorithmisch?

Naja, Du überlegst Dir, dass Du so lange zählen musst, bis das nächste Zeichen entweder nicht existiert, weil Du am Ende des Arrays stehst, oder nicht mit dem aktuellen übereinstimmt.

Wenn ich mich nicht vertan habe, also:
Code:
int anzahl = 0;
for (int i = 0; i < zeichen.length; i++) {
    anzahl++;
    if ((i+1) == zeichen.length || zeichen[i] != zeichen[i+1]) {
        System.out.printf("%c: %.2f %%\n", 
                zeichen[i], anzahl*100.0/zeichen.length);
        anzahl = 0;
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Array Anzahl verschiedener Werte ausgeben Java Basics - Anfänger-Themen 3
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
Ibrahim Anzahl möglicher Reiserouten zurückgeben Java Basics - Anfänger-Themen 5
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
B bei 2 Arrays Anzahl gleicher Elemente vergleichen? Java Basics - Anfänger-Themen 49
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
nils812 Black Jack Karten Anzahl begrenzen Java Basics - Anfänger-Themen 5
berserkerdq2 sqllite in Java, wenn ich mache select count(*) ..., erhalte ich dann nur die gezählte Anzahl oder werden auch die Tabellen ausgegeben? Java Basics - Anfänger-Themen 2
I Prüfen, ob Anzahl an Monate ein Jahr ergeben Java Basics - Anfänger-Themen 4
B Anzahl Nullen uns Einsen in String ermitteln Java Basics - Anfänger-Themen 3
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
C Anzahl ArrayLists unbekannt Java Basics - Anfänger-Themen 4
O Anzahl Datensätze ausgeben Java Basics - Anfänger-Themen 5
T Maximale Anzahl von Konsonanten im String Java Basics - Anfänger-Themen 6
N Aus einem String die Anzahl der Vokale auslesen Java Basics - Anfänger-Themen 40
W Dez-->Binär mit eigener bit Anzahl Erkennung. Java Basics - Anfänger-Themen 3
RudiRüssel maximale Anzahl von Schlüsseln in einer Hash Tabelle Java Basics - Anfänger-Themen 2
W Anzahl der Zeilen ausgeben lassen Java Basics - Anfänger-Themen 20
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
Kingamadeus2000 Anzahl der Ziffern der kürzesten Zahl aus einem zurückliefern Java Basics - Anfänger-Themen 1
Tino1993 for-Schleife, die eine vorgegebene Anzahl von Zeichen ausgibt Java Basics - Anfänger-Themen 3
M Anzahl Schleifendurchgänge nach x Sekunden anzeigen Java Basics - Anfänger-Themen 2
P Primzahl mit Angabe der höchsten Primzahl und Angabe der Anzahl von Primzahlen bis 100 Java Basics - Anfänger-Themen 8
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
Kirby.exe Anzahl vorkommender Elemente im Array zählen Java Basics - Anfänger-Themen 9
B Nur eine bestimmte Anzahl an Arrays ausgeben Java Basics - Anfänger-Themen 9
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
B Von Array nur eine bestimmte Anzahl bekommen Java Basics - Anfänger-Themen 3
L Anzahl der Paare deren Summe = 0 ergibt berechnen Java Basics - Anfänger-Themen 0
L Anzahl der Elemente key in einem Array mit log(N) Laufzeit Java Basics - Anfänger-Themen 4
L Anzahl der Aufrufe von Schleifen bestimmen Java Basics - Anfänger-Themen 1
D Alle Möglichkeiten, n-Anzahl aus Elementen aus einem Array zu wählen, ausgeben? Java Basics - Anfänger-Themen 23
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
O ObjectOutputStream Anzahl Objekte festhalten Java Basics - Anfänger-Themen 17
B Anzahl von Stunden / Tage von zwei Datumswerten ermitteln Java Basics - Anfänger-Themen 1
L Dynamische Anzahl an Arrays mit verschiedenen Namen erzeugen Java Basics - Anfänger-Themen 6
sondr Anzahl der gleichen Positionen im Array Java Basics - Anfänger-Themen 3
Y Konkrete Hilfe gesucht - Anzahl der Stellen einer eingegebenen Zahl überprüfen Java Basics - Anfänger-Themen 5
Y Begrenzte Anzahl an Objekten? Java Basics - Anfänger-Themen 12
P Input/Output Bestimmte Anzahl von Werten in einem Array an Methode übergeben Java Basics - Anfänger-Themen 2
L Graphen: Anzahl Knoten // Knoten in Array speichern Java Basics - Anfänger-Themen 4
E Anzahl Datensätze in Textfeld Java Basics - Anfänger-Themen 5
K Anzahl gleicher Elemente in Array Java Basics - Anfänger-Themen 32
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
L Feld mit beliebiger Anzahl von Buchstaben füllen... Java Basics - Anfänger-Themen 5
LikeManuel Anzahl der Teiler Java Basics - Anfänger-Themen 6
D Anzahl von Zahlen bei eingabe begrenzen Java Basics - Anfänger-Themen 37
T Erste Schritte Schreiben Sie eine Klasse Zeit, die eine Zeitdauer in Minuten beschreibt. Die Anzahl Minuten verwalt Java Basics - Anfänger-Themen 3
J Max. Anzahl von Knoten im Binärbaum Java Basics - Anfänger-Themen 3
ralli85 Programm nach einer gewissen Anzahl von Eingaben beenden Java Basics - Anfänger-Themen 15
Z Ausgabe: Anzahl Sterne, danach verringern Java Basics - Anfänger-Themen 7
R Anzahl von Zeichen in einem Char Array Java Basics - Anfänger-Themen 4
A Anzahl der Elemente in einem Stack wiedergeben Java Basics - Anfänger-Themen 3
V Anzahl der Möglichkeiten 20 € zu bezahlen Java Basics - Anfänger-Themen 2
A variable Anzahl an Nutzereinagben Java Basics - Anfänger-Themen 4
stylegangsta Anzahl der gefunden array Werte ausgeben Java Basics - Anfänger-Themen 6
D Variable Anzahl an Buttons per Schleife Java Basics - Anfänger-Themen 7
H Liste ausgeben (Spiel Hey Fisch (software-challenge) ändern Anzahl Fische) Java Basics - Anfänger-Themen 1
M Überschneidende Anzahl von Tagen Java Basics - Anfänger-Themen 4
D Suche nach der Anzahl von Zonen zwischen zwei Punkten Java Basics - Anfänger-Themen 2
S Input/Output Alphabet in eine Datei schreiben und Anzahl von Zeichen ausgeben. Java Basics - Anfänger-Themen 4
I Anzahl der Rechenschritte darstellen lassen Java Basics - Anfänger-Themen 11
C Anzahl bestimmter Zeichen in einem String ausgeben Java Basics - Anfänger-Themen 7
T Anzahl bestimmter Werte eines arrays bestimmen Java Basics - Anfänger-Themen 4
A Rekursion, Anzahl von Stellen ausgeben Java Basics - Anfänger-Themen 7
S Anzahl Quersummen bis zur Einstelligkeit Java Basics - Anfänger-Themen 12
S Anzahl unterschiedlicher Elemente zählen Java Basics - Anfänger-Themen 4
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
R Begrenzer Anzahl von paint() ? Java Basics - Anfänger-Themen 3
J Anzahl von for-Schleifen in Abhängigkeit von Zahleneingabe erzeugen Java Basics - Anfänger-Themen 1
C Beliebige Anzahl Arrays zusammenfügen Java Basics - Anfänger-Themen 5
L Best Practice Alle Kombinationen aus Listenelementen, Anzahl Listen unterschiedlich Java Basics - Anfänger-Themen 6
I Methoden ByteBuffer - Anzahl führender Nullen Java Basics - Anfänger-Themen 3
V Anzahl von gleichen Werten in einem Int-Array ermitteln Java Basics - Anfänger-Themen 4
B Anzahl if anweisungen nicht bekannt Java Basics - Anfänger-Themen 3
T Anzahl der Schritte berechnen Java Basics - Anfänger-Themen 6
R Anzahl der ineinander verschachtelten for-Schleifen von Variable abhängig machen Java Basics - Anfänger-Themen 5
P BitSet- Objekt- Anzahl der Elemente bestimmen Java Basics - Anfänger-Themen 2
B Variablen Unbekante anzahl an Strings splitten und vergleichen Java Basics - Anfänger-Themen 31
M Anzahl Zahlen in String Java Basics - Anfänger-Themen 21
A Threads Minimale und maximale Anzahl. Java Basics - Anfänger-Themen 28
J Bestimmte Anzahl Zeichen aneinander fügen Java Basics - Anfänger-Themen 9
H Anzahl Ziffer in Zahl bestimmen Java Basics - Anfänger-Themen 3
A Anzahl nodes in einem Tree Java Basics - Anfänger-Themen 2
G maximale Anzahl der Tage im Monat Java Basics - Anfänger-Themen 18
G Datentypen Double ausgeben mit minimaler Anzahl Nachkommastellen Java Basics - Anfänger-Themen 3
P Anzahl der else if Operatoren begrenzt?? Java Basics - Anfänger-Themen 7
B genaue Anzahl der Operationen in Schleifen Java Basics - Anfänger-Themen 5
Dit_ Anzahl der Bestellungen grafisch abbilden | Statistisk Java Basics - Anfänger-Themen 6
Luk10 Anzahl der Knoten in einem Baum ausgeben! Java Basics - Anfänger-Themen 6
F Methoden Hanoi - Anzahl der Bewegungen Java Basics - Anfänger-Themen 8
A Counter für die anzahl von regulären ausdrücken Java Basics - Anfänger-Themen 4
M float/double Anzahl Nachkommastellen ermitteln Java Basics - Anfänger-Themen 18
B Anzahl der Werte bestimmen Java Basics - Anfänger-Themen 14
K Sortierung von Anzahl der Wörtern in ArrayList Java Basics - Anfänger-Themen 4
X Anzahl Baumknoten bestimmen Java Basics - Anfänger-Themen 5
K Anzahl Wörter in Zeile Java Basics - Anfänger-Themen 24

Ähnliche Java Themen

Neue Themen


Oben