Einfache Textanalyse

Hallo Leute,

Ich habe folgendes Problem im: Ich bin ein Programmieranfänger und programmiere erst sei ca.3 Monaten. Nun habe ich folgende Aufgabenstellung:

Das Programm analysiert eingegebene Texte auf die Anzahl der enthaltenen Buchsta-ben, Ziffern und Wörter.
• Als Buchstaben zählen die Kleinbuchstaben (a-z) und die Großbuchstaben (A-Z), nicht aber Umlaute und Spezialbuchstaben (ß, …)
• Wörter sind zusammenhängende Folgen von Buchstaben. Alle anderen Zeichen (auch Ziffern) sind daher Trennzeichen!
Das Programm kann durch die Eingabe des Worts „quit“ beendet werden. Die Groß/Kleinschreibung ist dabei nicht zu beachten (es kann auch mit QUIT beendet werden)!

Mein Ansatz wäre einen String in ein char Array einzulesen, weiter weiß ich nicht.

Ich darf keine Methoden verwenden und kein wordcount.

Bitte brauche dringend Hilfe!

Als Buchstaben zählen die Kleinbuchstaben (a-z) und die Großbuchstaben (A-Z), nicht aber Umlaute und Spezialbuchstaben (ß, …)

Um zu zählen könnte man eine der Map Datenstruktur verwenden.

Wörter sind zusammenhängende Folgen von Buchstaben. Alle anderen Zeichen (auch Ziffern) sind daher Trennzeichen!
Das Programm kann durch die Eingabe des Worts „quit“ beendet werden. Die Groß/Kleinschreibung ist dabei nicht zu beachten (es kann auch mit QUIT beendet werden)!

Glaube die beiden Sachen dürften mit etwas Grips nicht so schwer zu lösen sein.

String in ein char Array einzulesen

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toCharArray()

Falls du zum Thema einlesen von der Kommandozeile etwas brauchst, hier ein Beispiel: https://javatutorialhq.com/java/io/bufferedreader-class-example/

@mdickie
Danke für die Anwort,

Das Problem ist das wir kein bufferreader verwenden dürfen, wir noch keine Map-Datenstruktur gelernt haben das Beenden mit quit und einen String in ein char array einzulesen habe ich schon gelöst aber die wWortzählung bereitet mir leider weiterhin Schwierigkeiten .

Danke für die Antwort

Achso, wenn ihr das nicht verwenden dürft, rate ich dir ein Blick auf die ASCII-Tabelle zu legen. Du kannst den char Datentyp nämlich auch als index für Arrays verwenden:

int  zaehler [] = new int [58];
zaehler ['z' - 'A']++;
System.out.print(zaehler ['z' - 'A']);

Der Zähler von z wird in diesem Fall addiert

@mdickie

Danke für diesen Lösungsvorschlag aber funktioniert das auch bei meinem Problem.

z.b
Hallo12345Welt Wörter:2
Äö? Wörter:0
Hallo 1Ahloa Wörter:2
Wörter Wörter:2

Und ich darf nur ein Array verwenden.
Danke!

Achso wenn du Zahlen auch zählen willst, müsstest du das Array größer machen und statt -'A' -'0' verwenden. Wie gesagt einfach ASCII-Tabelle verwenden für die Addition bzw. Subtraktion von Zeichen.

ASCII-Tabelle wird bei ö und ß schon schwierig…

Wurde explizit gesagt, dass man die nicht verwenden darf? Ich meine… ich habe in der Schule auch nichts über Maps gelernt (höchstens im Geographieunterricht), das muss ja kein Argument sein…

Umlaute sind sowieso von der Zählung ausgeschlossen, wenn ich richtig verstanden habe.

Hier mal eine Minimalbeispiel:

import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.PriorityQueue;

public class Zaehler {
	public static final class E {
		String s;
		int i;

		E(String s, int i) {
			this.s = s;
			this.i = i;
		}

		@Override
		public String toString() {
			return String.format("E [s=%s, i=%s]", s, i);
		}
	}

	int[] countChars(String s) {
		int[] cs = new int[Character.MAX_VALUE + 1];
		for (char c : s.toCharArray()) {
			cs[c]++;
		}
		return cs;
	}

	LinkedHashMap<String, Integer> countWords(String s) {
		LinkedHashMap<String, Integer> r = new LinkedHashMap<String, Integer>();
		String[] ss = s.split("\\W+");
		for (String string : ss) {
			string = string.toLowerCase();
			if (r.containsKey(string)) {
				r.put(string, r.get(string) + 1);
			} else {
				r.put(string, 1);
			}
		}
		return r;
	}

	public static void main(String[] args) {
		Zaehler zaehler = new Zaehler();
		LinkedHashMap<String, Integer> countWords = zaehler.countWords("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.");

		PriorityQueue<E> pq = new PriorityQueue<E>(new Comparator<E>() {
			public int compare(E o1, E o2) {
				if (o1.i == o2.i) {
					return o1.s.compareTo(o2.s);
				}
				return o2.i - o1.i;
			}
		});
		for (Entry<String, Integer> e : countWords.entrySet()) {
			pq.add(new E(e.getKey(), e.getValue()));
		}
		for (E e : pq) {
			System.out.println(e);
		}
	}
}

@CyborgBeta

Leider dürfen wir das alles nicht verwenden

@mdickie
Das ist Korrekt

	int[] countChars(String s) {
		int[] cs = new int[Character.MAX_VALUE + 1];
		for (char c : s.toCharArray()) {
			cs[c]++;
		}
		return cs;
	}

…dürft ihr doch bestimmt verwenden.

@CyborgBeta
Leider Nein wir sind leider sehr eingeschränkt
Trotzdem Danke

Gut, dann ist das nicht möglich. :wink:

/e Ich sehe gerade, dass das keinen Effekt hat:

				if (o1.i == o2.i) {
					return o1.s.compareTo(o2.s);
				}

bitte diese Zeilen entfernen.

Kannst du zum Wörter Zählen nicht einfach zählen wann ein Trennzeichen auf einen Buchstaben folgt?

boolean letztesZeichenWarBuchstabe = false;
int anzahlWörter = 0;
int anzahlBuchstaben = 0;
int anzahlZiffern = 0;

for( int i = 0; i < buchstabenArray.length; i++ ) {
    char c = buchstabenArray[i];

    if( c >= 'a' && c <= 'Z' ) {
        anzahlBuchstaben++;
        letztesZeichenWarBuchstabe = true;

    } else if( c >= '0' && c <= '9'  ) {
        anzahlZiffern++;
        if( letztesZeichenWarBuchstabe )
            anzahlWörter++;
        letztesZeichenWarBuchstabe = false;

    } else {
        if( letztesZeichenWarBuchstabe )
            anzahlWörter++;
        letztesZeichenWarBuchstabe = false;
    }
}

if( anzahlBuchstaben  > 0 )
        anzahlWörter++;
}
´´´

Anstatt PriorityQueue bitte einfach ArrayList o. Ä. verwenden. :wink: