Java Buchstabenzählprogramm, wie kann ich das machen?
Moin, bin gerade dabei ein Programm zu schreiben, dass einen Text einliest und mir dann die Häufigkeit der einzelnen Buchstaben ausgeben soll. Diese Werte speichere ich in einem Array. Nun ist das Problem, dass immer wenn ich einen neuen Buchstaben übergebe, dieser in den alten überschrieben wird.
Ich hoffe ihr versteht mein Problem und jemand kann mir nen Tipp geben, wie das Problem zu lösen ist.
Den Quellcode habe ich angefügt.
Ps: Ich bin ein absoluter Anfänger!
Das Problem ist quasi in meiner symbolInArray Methode bei der if-Abfrage.
Das Problem ist quasi bei der Methode SymbolInArray bei der IfAbfrage.
2 Antworten
Mir ist ehrlichgesagt nicht ganz klar, wie die Funktion symbolInArray funktionieren soll. Vor allem der erste Teil. Du suchst in elemente nach dem aktuellen Buchstaben und jedes mal, wenn an der aktuellen Position nicht der gesuchte Buchstabe steht, schreibst du den aktuellen Buchstaben rein (?). Mit fileReader.next() liest du übrigens auch nicht die nächste Zeile ein, sondern nur das nächste Wort.
Hier mal meine Variante:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class LetterCount {
public static void main(String[] args) {
String text= ""; // Die Variable, in der der Text stehen soll
// Komplette Datei in die Variable einlesen
try {
Scanner scanner = new Scanner(new File("DarkSouls.txt"));
text = scanner.useDelimiter("\\A").next();
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
int[] letters = new int[26]; // Ein Feld für jeden Buchstaben im Alphabet
int others = 0; // Hier drin zählen wir alle anderen Zeichen, die keine Buchstaben sind
// (falls du das überhaupt haben willst)
// Wir wandeln den Text in Großbuchstaben um und gehen jeden Buchstaben durch
for (char letter:text.toUpperCase().toCharArray()) {
letter -= 'A'; // 'A' vom aktuellen Buchtaben subtrahieren, so dass wir
// eine Zahl zwischen 0 und 25 erhalten (0 = A, 1 = B etc.)
// Falls das aktuelle Zeichen ein Buchstabe ist, erhöhen wir den entsprechenden
// Eintrag im letter-Array. Ansonsten erhöhen wir die others-Variable
if (letter >= 0 && letter < 26) {
letters[letter]++;
} else {
others++;
}
}
// Ausgabe: Wir fangen mit 'A' an und schreiben die gezählten Buchstaben für jeden
// Buchstaben im Alphabet
char outLetter = 'A';
for (int i = 0; i < 26; i++) {
System.out.println(outLetter + ": " + letters[i]);
outLetter++;
}
// Und natürlich werden noch die anderen Zeichen ausgegeben.
System.out.println("Andere Zeichen: " + others);
}
}
Oder falls du alle Zeichen zählen willst und Streams benutzen darfst:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;
import java.util.function.Function;
import java.util.stream.Collectors;
public class CharCount {
public static void main(String[] args) {
String text= ""; // Die Variable, in der der Text stehen soll
// Komplette Datei in die Variable einlesen
try {
Scanner scanner = new Scanner(new File("C:\\temp\\Outlook.txt"));
text = scanner.useDelimiter("\\A").next();
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// Zeichen gruppieren und zählen
Map<String, Long> charGroup = Arrays.stream(text.split("")).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// Map ausgeben
System.out.println(charGroup);
// oder
charGroup.entrySet().forEach(e->System.out.println(e.getKey() + ": " + e.getValue()));
}
}
Es wäre wirklich gut, wenn du deine Variablen so benennen würdest, sodass klar ist, welchem Zweck sie dienen.
Dein Problem liegt wohl darin, dass du p innerhalb des Schleifenkörpers erstellst. So ist dessen Wert immer 0 und die Inkrementation später ist ohne Nutzen, denn beim nächsten Iterationsschritt ist diese Variable nicht mehr da und stattdessen wird eine neue Variable p (wieder mit dem Startwert 0) erzeugt.
Du kannst im Schleifenkopf mehrere Variablen deklarieren.
for (int i = 0, p = 0; i < cara.length; ++i, ++p) {
// ...
Aber eigentlich ist das auch unnötig. Du hast doch schon i. Deren Wert kannst du doch fortlaufend verwenden. Die Variable p kann raus.
Vielen Dank, für die Antwort! Hat leider nicht funktioniert, aber trd danke!