Java Buchstabenzählprogramm, wie kann ich das machen?


22.11.2020, 19:24

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.


Lucah00 
Fragesteller
 22.11.2020, 19:53

Vielen Dank, für die Antwort! Hat leider nicht funktioniert, aber trd danke!

0
regex9  22.11.2020, 19:56
@Lucah00

Auf diese Fehlerbeschreibung kann ich nur einen Tipp geben: Beschäftige dich mit dem Debugger. Dieses Tool ist in vielen IDEs integriert und die Bedienung unterscheidet sich meist kaum.

1
Lucah00 
Fragesteller
 22.11.2020, 19:57
@regex9

Alles klar, ich probiers mal! Vielen Dank!

0