Buchstaben zählen

javaFanboy

Mitglied
Moin,

ich möchte gerne durch Buchstabenhäufigkeitsanalysen feststellen, in welcher Sprache ein gewisser Text verfasst ist. Dazu lade ich eine Textdatei und speichere diese in einem String (nur Kleinbuchstaben, keine Sonderzeichen und keine Leerzeichen).

Anschließend möchte ich die Buchstaben zählen und habe dazu diesen kleinen Code gefunden:
Java:
	public static void main(String[] args) {
		Map<Character,Integer> amount = new HashMap<Character, Integer>();
		String example = "afdieKJDKFJDFKkdjfkjdfkjdfkKJFDfijakfjaöifdakfjafiafijfiajföiafaifaiföjaf";
		
		for(int i = 0; i < example.length(); i++){
			if(amount.containsKey(example.charAt(i))){
				int j = amount.get(example.charAt(i));
				j++;
				amount.put(example.charAt(i), j);
			}else{
				amount.put(example.charAt(i), 0);
			}
		}
		Iterator it = amount.entrySet().iterator();
		while(it.hasNext()){
			Entry temp = (Entry) it.next();
			System.out.println(temp.getKey() + ": " + temp.getValue());
		}
	}

Nun möchte ich aber irgendwie die Buchstaben sortiert ausgeben von a bis z, aber irgendwie will er nicht so richtig, sondern es wird kreuz und quer ausgeben. Außerdem würde ich das ganze gerne relativ zur Länge des Strings ausgeben, also als Prozentzahlen, aber auch daran scheitere ich irgendwie.

Hat jemand vielleicht einen Tipp für mich?
Danke.
 

eRaaaa

Top Contributor
speichere diese in einem String (nur Kleinbuchstaben, keine Sonderzeichen und keine Leerzeichen).
Ich sehe auch Großbuchstaben
Nun möchte ich aber irgendwie die Buchstaben sortiert ausgeben von a bis z, aber irgendwie will er nicht so richtig, sondern es wird kreuz und quer ausgeben.
Nehme TreeMap anstelle HashMap
Außerdem würde ich das ganze gerne relativ zur Länge des Strings ausgeben, also als Prozentzahlen, aber auch daran scheitere ich irgendwie.

Wo genau? Prozentrechnung? Die Länge des Strings erhältst du mit
Code:
length()
 

XHelp

Top Contributor
HashMap sortiert nicht nach Buchstaben. Da müsstest du schon die was einfalle lassen. (z.B. Ursprungsstring in char-Array packen, gleiche löschen, sortieren).

Wo genau ist dein Problem mit prizentzahlen? Du hast die Gesamtlänge und Anzahl der jeweiligen Buchstaben... reicht doch.
(wobei mir nicht klar ist, warum du bei der Anzahl bei 0 anfängst)

Generell zu deinem Vorhaben: du solltest nicht nur einzelne buchstaben untersuchen, sondern generell Tokens: mit Länge 1, mit Länge 2, 3, 4 usw bis X, dann werden die Ergebnisse besser.
 

javaFanboy

Mitglied
Danke für die Antwort. Da nimmt einen Java ja richtig Arbeit ab...

Nun habe ich das ganze also in ein Array konvertiert und dann sortiert. Anschließend wieder zu einem langen String zusammengefügt. Nun würde ich gerne dort wieder drüber laufen und die Buchstaben zählen. Wie könnte ich das denn jetzt am geschicktesten machen, damit ich am ende eine tabelle habe mit den absoluten häufigkeiten jedes einzelnen Buchstaben?
 

XHelp

Top Contributor
Naja, am besten du machst dir paar Klassen. Vor allem wenn du dann später mit deiner Beispielkollektion vergleichst, wirst es vom Vorteil sein.
Und im voraus das ganze zu sortieren macht wenig Sinn, weil HashMap immer noch in einer eigenen Reihenfolge das ganze speichert. Also entweder dieses Array nur für die Ausgabe verwenden oder wie eRaaaa es gesagt hat: TreeMap
 

javaFanboy

Mitglied
Hallo,

ich hatte jetzt gedacht, dass ich wieder die absoluten Zahlen ermittle. Die müssen ja auch nicht sortiert sein. Dann habe ich eine Liste mit relativen Zahlen zur Verfügung und würde jetzt schauen, bei welcher Sprache der Abstand zu den einzelnen gegebenen Prozentzahlen am kleinsten sind und dieses dann ausgeben.

Welche Klassen würdest du denn benutzen? Ich bin noch nicht so konform mit der JavaProgrammierung...
 

XHelp

Top Contributor
Du musst eine Summe über die Abstände bilden. Wo die Summe am kleinsten ist, ist die wahrscheinlichste Sprache.
Also du könntest mindestens eine Klasse "Sprache" erstellen, die eben die Tokens gespeichert hält. Der Sinn des ganzen ist: wenn ein Token nicht in der Sprache ist, musst du ja jetzt mit
Code:
if (bla.contains...
an jeder Stelle abfragen. So könntest du es nur einmalig in der "Sprache" machen und dann eine 0 zurückgeben. Dann kannst du auch bequem eine Utility-Klasse machen mit "vergleiche(Sprache a, Sprache b)" usw.
Dann kannst du auch eine Klasse "Token" machen...
und was die sonst so einfällt, damit es etwas strukturierter aussieht.
 

Marco13

Top Contributor
Für die Minimallösung der beschriebenen Aufgabe (nur Kleinbuchstaben) wäre IMHO eigentlich ein Array schon ausreichend
counters[character-'a']++;
aber offenbar soll da ja was größeres draus werden, da kann eine Abstraktion nicht schaden.

Übrigens wäre eine HashMap so wie ich das sehe schon besser geeignet. Wenn man 1 Million Buchstaben hat, hat man bei einer TreeMap
1 Million * log(anzahlUnterschiedlicherBuchstaben)
Operationen beim Einfügen+Zählen, bei einer HashMap
1 Million
Die Einträge der HashMap kann man nachher noch sortieren (das sind ja nur anzahlUnterschiedlicherBuchstaben Stück)
 

javaFanboy

Mitglied
Hallo,

also die TreeMap würde ja schon einmal sortiert das ganze zurück geben. Aber leider immer nur in absoluten Zahlen. Wie muss ich den Code (siehe oben) anpassen, dass ich relative Zahlen bekomme? Also irgendwo muss ich noch durch die StringLänge teilen...

Viele Grüße.
 

timbeau

Gesperrter Benutzer
Geht das nicht bei der Ausgabe oder einfach ein zusätzliches Array mit der Länge der TreeMap und dann in jedem Feld den Wert berechnen.
 

javaFanboy

Mitglied
Hallo,

habe jetzt unten die Ausgabe so angepasst:
Java:
            Entry temp1 = (Entry)it.next();
            int i = Integer.parseInt(temp1.getValue().toString());
            double count = i / string.length();
            System.out.println(temp1.getKey() + ": " + Double.toString(count));

Aber ich erhalte jetzt nur 0.0 überall als Ergebnis...
 
G

Gast2

Gast
Java:
i / string.length()
i ist ein int, string.length() ist ein int. Das Ergebis davon ist wieder ein int.
caste einen Operanden auf double und du erhälst deine nachkommastellen :)
 
B

bygones

Gast
ich würde da auch nicht das Rad neu erfinden. Die Datenstruktur die du suchst ist "Bag" und zb zu finden Multiset (Google Collections Library 1.0 (FINAL)) .

schaut dann so aus
Java:
String example = "afdieKJDKFJDFKkdjfkjdfkjdfkKJFDfijakfjaöifdakfjafiafijfiajföiafaifaiföjaf";
Multiset multiset = HashMultiset.create(Lists.newArrayList(example.split("")));

Sortieren würde ich dann auch erst bei der Ausgabe und gar nicht beim produktiven Arbeiten.

wobei man auch mit den Google Collections das einfach lösen kann
Java:
String example = "afdieKJDKFJDFKkdjfkjdfkjdfkKJFDfijakfjaöifdakfjafiafijfiajföiafaifaiföjaf";
Multiset multiset = TreeMultiset.create(Lists.newArrayList(example.split("")));
 
Zuletzt bearbeitet von einem Moderator:

Andi_CH

Top Contributor
Es ist mir klar, dass meine Frage nur zum Teil zum Thema passt.

Ich habe irgendwo einmal eine wirklich gute Tabelle gefunden in der die verschiedenen Colletions, Bags und was auch immer verglichen werden konnten - sozusagen auch ein Entscheidungsbaum was optimal für ein bestimmtest Problem ist - Ein virtuelles Bier für den Hinweis wo ich das finde :)

Ein Gedanke zum Problem : da ist vieles overkill.

(Das Problem der Häufigkeit habe ich schon einmal gelöst - wir haben aber Triphone genommen. Das sind Dreiergruppen inklusive whitespaces, diese aber auf jeweils einen reduziert - das war sehr zuverlässig für die Spracherkennung)

Meine Lösung damals in ANSI-C - ich iterierte durch den Text und inkrementierte in einem 3D int array hoch

Alles was folgt ist natürlich Pseudo :) und für 1D Array

Code:
int[26] i;
for (char c in test) {
  int index = int(c)-int('a')
  i[index] +=1
}
Danach mit der Gesamtantzahl der Buchstaben normieren (wir blieben bei int - einfach mit 1000 multipliziert oder so - es ist lange her, ich weiss es nicht mehr im Detail)

Das macht man für Referenztexte sowie für zu untersuchende Texte

Kriterium um welche Sprache es sich handelt:

Loop über den int[26] array des zu prüfenden Textes und alle Referenzarrays
Differenz zur entsprechenden Position der Referenzarrays bilden und diese Aufsummieren.

die kleinste Differenz ergibt die Sprache.
 
Zuletzt bearbeitet:

javaFanboy

Mitglied
Hallo,

habe jetzt ein wenig umstrukturiert und erhalte nun die Tabelle, in einer Variable, welche ich jetzt überprüfen möchte, um welche Sprache es sich handelt.

Hier gibt es eine Auflistung der verschiedenen Sprachen mit ihrer Häufigkeit. Doch wie kann ich jetzt am Besten vorgehen um festzustellen, welche Sprache der Text hat?
 

XHelp

Top Contributor
Wie gesagt: über den Betrag der Differenzen eine Summe bilden, und wo die Summe am kleinsten ist: ist es vermutlich die gesuchte Sprache.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Buchstaben zählen Java Basics - Anfänger-Themen 9
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
G Erste Schritte Einen Array absuchen und Buchstaben zählen Java Basics - Anfänger-Themen 17
J Buchstaben aus String einzeln Zählen Java Basics - Anfänger-Themen 12
A Erste Schritte Datei einlesen und Buchstaben zählen Java Basics - Anfänger-Themen 13
M Von File lesen Buchstaben lesen und zählen - scheitert an der Eingabe Java Basics - Anfänger-Themen 4
S Buchstaben/Wörter im String zählen Java Basics - Anfänger-Themen 6
R buchstaben zählen Java Basics - Anfänger-Themen 8
V Anzahl eines Buchstaben in einem String zählen Java Basics - Anfänger-Themen 7
J Buchstaben zählen Java Basics - Anfänger-Themen 4
H Buchstaben zählen! Java Basics - Anfänger-Themen 3
S Buchstaben zählen Java Basics - Anfänger-Themen 7
M Buchstaben zählen aus txt Datei Java Basics - Anfänger-Themen 30
R Bestimmten Buchstaben im String zählen Java Basics - Anfänger-Themen 9
B Buchstaben/Zahlen zählen Java Basics - Anfänger-Themen 2
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
L Buchstaben entfernen zipZap Java Basics - Anfänger-Themen 8
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
S Buchstaben Programmierung Bedeutung Java Basics - Anfänger-Themen 4
C In String, Buchstaben ersetzen durch andere Buchstaben Java Basics - Anfänger-Themen 26
Tom/S KeyCode zu Buchstaben Java Basics - Anfänger-Themen 0
C ArrayList sortieren nach bestimmten Buchstaben in den Wörtern Java Basics - Anfänger-Themen 13
R Mehrere Buchstaben aus einem String entfernen Java Basics - Anfänger-Themen 1
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
J Buchstabenhäufigkeit mit Array und Ausgabe des häufigsten Buchstaben Java Basics - Anfänger-Themen 25
J Buchstaben aus textArea extrahieren Java Basics - Anfänger-Themen 4
S Buchstaben in Großbuchstaben (Strings) Java Basics - Anfänger-Themen 5
O FilterStream häufigkeit der Buchstaben Java Basics - Anfänger-Themen 43
F Buchstaben in einem String vertauschen (Ohne replace) Java Basics - Anfänger-Themen 10
H Anzahl verschiedener Buchstaben im String Java Basics - Anfänger-Themen 41
A Erste Schritte Buchstaben im Array suchen Java Basics - Anfänger-Themen 8
K String buchstaben auslesen Java Basics - Anfänger-Themen 9
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
J Für jeden Buchstaben eine Zahl Java Basics - Anfänger-Themen 1
B Wie kann ich die Buchstaben sortieren nach der Höhe der Zahlen Java Basics - Anfänger-Themen 14
Z Ersten Buchstaben eines Elements eines String-Arrays auslesen Java Basics - Anfänger-Themen 5
x-tshainge Zahlen Buchstaben zuordnen Java Basics - Anfänger-Themen 4
T Datentypen char als Buchstaben statt als Zahl ausgeben Java Basics - Anfänger-Themen 4
M replace Methode für Buchstaben Java Basics - Anfänger-Themen 29
L Feld mit beliebiger Anzahl von Buchstaben füllen... Java Basics - Anfänger-Themen 5
J Methoden Eingabe Methode nur Buchstaben Java Basics - Anfänger-Themen 4
I Hilfe beim löschen von Buchstaben. Java Basics - Anfänger-Themen 1
I Hilfe beim löschen schon Buchstaben. Java Basics - Anfänger-Themen 4
DestinatioN Problem beim splitten eines Satzes in Wörter und die Wörter in Buchstaben Java Basics - Anfänger-Themen 2
V char Eingabe aber nur für Buchstaben Java Basics - Anfänger-Themen 4
J Zufällige Buchstaben Java Basics - Anfänger-Themen 45
C Klassen Positionszähler auf Buchstaben setzen Java Basics - Anfänger-Themen 14
D Input/Output Buchstaben als bestimmte Zahl erkennen Java Basics - Anfänger-Themen 4
S Input/Output Buchstaben in Eingabe finden und ausgeben Java Basics - Anfänger-Themen 5
R [Erledigt]Fehler beim löschen von einzelnen Buchstaben aus StringBuilder Java Basics - Anfänger-Themen 1
Bregedur String beim nächstem groß geschriebenen Buchstaben trennen Java Basics - Anfänger-Themen 1
E Input/Output Konsole erkennt meinen Buchstaben nicht Java Basics - Anfänger-Themen 12
F Häufigkeit von Buchstaben Java Basics - Anfänger-Themen 7
L Java Strings Buchstaben vertauschen Java Basics - Anfänger-Themen 4
I Programm, welches eine Textzeile einliest und alle darin enthaltenen Buchstaben umwandelt Java Basics - Anfänger-Themen 3
S String ab dem Wechsel Buchstaben zu Zahlen splitten Java Basics - Anfänger-Themen 14
A Erste Schritte Buchstaben in zahlen umwandeln Java Basics - Anfänger-Themen 4
S Groß bzw. Klein Buchstaben umwandeln (gemischt) Java Basics - Anfänger-Themen 1
S Einzelne Buchstaben aus Jtextfield in array Java Basics - Anfänger-Themen 2
A OOP Buchstaben mit ASCII Werten darstellen Java Basics - Anfänger-Themen 1
M String überprüfen ob nur Buchstaben enthalten sind? Java Basics - Anfänger-Themen 10
E Buchstaben verhindern / Try & Catch Block Java Basics - Anfänger-Themen 3
B Zahlen und Buchstaben in cmd eingeben Java Basics - Anfänger-Themen 5
S nur Buchstaben in JTextField Java Basics - Anfänger-Themen 3
X String einzelne Buchstaben ersetzen Java Basics - Anfänger-Themen 4
V Zufallsgenerator für Buchstaben Java Basics - Anfänger-Themen 22
A Erste Schritte konsoleneingabe von Buchstaben Java Basics - Anfänger-Themen 3
K Methoden Kontrollstruktur versagt bei Buchstaben... Java Basics - Anfänger-Themen 6
E Buchstaben nach Größe vergleichen Java Basics - Anfänger-Themen 4
M Benennung nach Buchstaben Java Basics - Anfänger-Themen 18
M Erste Schritte zwei Buchstaben die im String enthalten sind ausgeben Java Basics - Anfänger-Themen 21
J Programm zum Buchstaben austauschen, logikproblem Java Basics - Anfänger-Themen 2
T keine buchstaben!nur zahlen eingabe möglich Java Basics - Anfänger-Themen 48
P toUpperCase() - Buchstaben die ersetzt werden als Großbuchstaben ausgeben Java Basics - Anfänger-Themen 5
R Regexp nur Buchstaben und Ziffener beliebig oft Java Basics - Anfänger-Themen 3
R buchstaben einlesen - fehlermeldung schreiben? Java Basics - Anfänger-Themen 9
M String (mit Buchstaben) zu Int Java Basics - Anfänger-Themen 6
D Buchstaben den jeweiligen Zahlen hinzufügen mit einer if. Java Basics - Anfänger-Themen 6
F Datentypen Zufällige Buchstaben vertauschen Java Basics - Anfänger-Themen 3
K Zahlen und buchstaben gemeinsam in ein array? Java Basics - Anfänger-Themen 17
F Leerzeichen zwischen jeden Buchstaben eines Strings einfügen Java Basics - Anfänger-Themen 16
H String zerlegen in einzelne Buchstaben (char)?? Java Basics - Anfänger-Themen 7
R In einem Palindrom 2 Buchstaben vergleichen Java Basics - Anfänger-Themen 16
J Anzahl der Buchstaben in einem String Java Basics - Anfänger-Themen 12
P Buchstaben: Haeufigkeitstabelle Java Basics - Anfänger-Themen 9
S String Elemente bzw. Buchstaben miteinander vertauschen? Java Basics - Anfänger-Themen 6
T JTextField max. 8 Zeichen, nur Buchstaben Java Basics - Anfänger-Themen 8
M jeden 2ten Buchstaben aus array Java Basics - Anfänger-Themen 6
C ASCII Codes in Buchstaben umwandeln Java Basics - Anfänger-Themen 2
J Buchstaben einlesen Java Basics - Anfänger-Themen 8
T Buchstaben an bestimmter Stelle aus String lesen Java Basics - Anfänger-Themen 5
A eingelesene String in buchstaben teilen Java Basics - Anfänger-Themen 9
D Suche in JList nach dem ersten Buchstaben Java Basics - Anfänger-Themen 2
G Griechische statt lateinischen Buchstaben beim Schreiben Java Basics - Anfänger-Themen 9
X Auswahl durch Eingabe von Buchstaben - aber wie? Java Basics - Anfänger-Themen 2
T Ersten Buchstaben in einem Wort groß schreiben. Java Basics - Anfänger-Themen 6
N alle "3er" Möglichkeiten aus 10 Buchstaben Java Basics - Anfänger-Themen 6
A Beliebiger String --> Buchstaben und Zahlen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben