Häufigstes Zeichen in einem Char-Array ermitteln?

Status
Nicht offen für weitere Antworten.

0001001

Bekanntes Mitglied
Kann mir jemand einen Tip geben wie man am einfachsten das häufigste Zeichen eines Char-Array ermittelt?

Ich hätte es jetzt so gemacht:
Code:
	public static int getk(char[] a){
		int laenge= a.length;
		int[] array = new int[laenge];	// neues array anlegen für die häufigkeit der einzelnen buchstaben
		for(int i=0;i<=a.length-1;i++){
			for(int j=0;j<=a.length-1;j++){
				if(a[i]==a[j]){
					array[i]= array[i] +1;		// wenn ein buchstabe mehrmals auftritt fuer jeden auftritt eins addieren
				}
			}
		}
}

Es wird ein zweites array (array) angelegt in dem für jeden buchstaben aus dem char array a die häufigkeit gespeichert werden soll.
Jetzt wird mit einer doppelschleife jeweils ein element mit allen anderen verglichen und falls es gleich ist wird im array eins dazugezählt.
Jetzt muss man das array array nochmals durchlaufen und den größten wert ermitteln.

Geht das auch einfacher?
 

Leroy42

Top Contributor
Wenn dur nur den häufigsten Buchstaben brauchst und nicht die Häufigkeiten aller
Buchstaben, kannst du den Code beschleunigen; aber nicht vereinfachen. Zur Zeit gehst
du die mehrfachen Elemente auch mehrfach durch :( Aufwand: O(n^2)

1. Dein zweites Array ist nur ein char-Array. Es nimmt die Buchstaben auf, die schon
getestet wurden; nebenbei merkst du dir wieviele verschiedene Buchstaben du in
dieses Array bereits aufgenommen hast.
2. Du merkst dir das aktuell häufigste Zeichen und wie oft es vorkommt.
3. Eine Schleife über dein Ursprungsarray. Wenn das aktuelle Zeichen noch nicht
bearbeitet wurde (kein Eintrag im 2. Array bis zu dessen aktueller Länge) dann
4. Eine innere Schleife, beginnend ab dem i+1. Index deiner äußeren bis zum Ende,
zählt die Vorkommen des aktuellen Zeichens
5. Falls neues Maximum ==> merken.

Aufwand: Kleiner als O(n*(n-1)/2)

Wenn der Bereich deines char-Arrays allerdings bekannt ist und relativ klein, dann ist
die schnellste Möglichkeit ein 2. Array das dein char-Bereich abdeckt und indem du direkt,
d.h. mit nur einem Zugriff die Anzahl mitzählst. Am Schluß in diesem Array das größte
Element suchen.
Aufwand: O(n)

Da char's nur Werte von 0..65535 annehmen können, ist diese Methode heutzutage
immer vorzuziehen. Oder hast du eine Java-Installation auf deinem alten C64 :cool:
 

0001001

Bekanntes Mitglied
Hehe, ne mein C64 sammelt Staub im Keller =)

Ich brauche nur den häufigsten Buchstaben, wenn es allerdings häufigste Buchstaben gibt, brauch ich die natürlich alle.

Du schreibst das so leicht, dass man beim Schleifendurchlauf gleich mitzählt, wie oft ein Buchstabe vorkommt, leider verstehe ich dich nicht ganz.
Meinst du mit char-Bereich abdecken, dass wenn mein char array 500 Buchstaben hat, ich dann auch ein int array mit 500 Feldern anlege?
Oder meinst du, dass z.B. nur Buchstaben des Alphabets vorkommen und ich dann ein int array anlege mit 26 Feldern?
Bei letzterem müsste ich doch für jeden Buchstaben einen solchen Vergleich machen:
Code:
if (char_array[i]== 'A')
                int_array[i] = int_array[i] +1;
Und das für alle 26 Buchstaben.
 

Leroy42

Top Contributor
0001001 hat gesagt.:
Oder meinst du, dass z.B. nur Buchstaben des Alphabets vorkommen und ich dann ein int array anlege mit 26 Feldern?
Genau!
Aber dieses Häufigkeitsarray inidzierst du dann direkt mit deinem, eventuell
transformierten, char. Mal am Beispiel der Buchstaben.

Wenn du weißt, daß du nur (ASCII) Großbuchstaben hast, brauchst dein array nur 26
Elemente groß sein und du benutzt folgende Transformation:

'A' ==> Index 0
'B' ==> Index 1
...
'Z' ==> Index 25

Also
Code:
int[] count = new int['Z'-'A'+1];     // weiß jetzt nicht ob lokale arrays schon mit 0 initialisiert sind.
for (int i=0; i < charArray.length)
    count[charArray[i] - 'A']++;
max = 0;
for (int i=0; i < count.length)
    if (count[i] > count[max]) max = i
// Jetzt ist (char) (max+'A') das häufigst zeichen mit anzahl count[max]
Hierbei muß der mögliche Zeichenbereich allerdings zusammenhängend sein.

Aber, wie schon gesagt, bei heutigen Rechnern kannst du getrost den gesamten
char-Bereich benutzen. Und der Durchlauf durche die 64K-Elemente am Ende zur
Bestimmung des häufigsten Zeichens dauert auf meinem Rechner z.B. nur
187 Nanosekunden.
 

0001001

Bekanntes Mitglied
Danke das hilft mir schon sehr. Habs zwischenzeitlich mal so probiert:
Hier sind jetzt pro Buchstabe die Häufigkeiten im Array gespeichert:
Code:
	public static int getk(char[] a){	

		*/
		char[] alphabet = {'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'};
		int[] alphabetnummerisch = new int[26];
		for(int w=0;w<=a.length-1;w++){
			for(int v=0;v<=alphabet.length-1;v++){
				if(a[w]==alphabet[v]){
					alphabetnummerisch[v]++;
				}					
			}				
		}
 

Leroy42

Top Contributor
Im Prinzip richtig, aber dein zweites char-Array und die gesamte innere
Schleife in der du den Index für dein aktuelles Zeichen suchst sind
schlicht und ergreifend unnötig. :bahnhof:

Zur Verdeutlichung:

Wo findet deine innere Schleife den Index für das Zeichen 'A': Immer an der Stelle 0, also index=0.
Wo findet deine innere Schleife den Index für das Zeichen 'B': Immer an der Stelle 1, also index=1.
Wo findet deine innere Schleife den Index für das Zeichen 'Z': Immer an der Stelle 25, also index=25.

Verstehst du was ich meine ???:L

Du brauchst gar nicht lange zu suchen, sondern kannst mit einer Subtraktion sofort den Index benennen.

'A' - 'A' = 0
'B' - 'A' = 1
'Z' - 'A' = 25

Also einfach:

Code:
for(int v = 0;v < alphabet.length;v++) { 
    alphabetnummerisch[a[w] - 'A']++; 
}
Klar? :cool:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Quelltext mit komischen griechischen Zeichen Java Basics - Anfänger-Themen 4
T or zeichen Java Basics - Anfänger-Themen 2
L 4 stelliges Passwort aus bestimmten Zeichen. Java Basics - Anfänger-Themen 27
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
O Array mit einem Zeichen vergleichen Java Basics - Anfänger-Themen 1
S Was bedeutet das Zeichen := Java Basics - Anfänger-Themen 9
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
L Zeichen an bestimmter Stelle auslesen Java Basics - Anfänger-Themen 4
S Arrayausgabe und nur einmal ein Zeichen davor Java Basics - Anfänger-Themen 12
johnboyne Java Zeichen Trennen Java Basics - Anfänger-Themen 1
T Zeichen im String verschiebe Java Basics - Anfänger-Themen 17
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
Tino1993 for-Schleife, die eine vorgegebene Anzahl von Zeichen ausgibt Java Basics - Anfänger-Themen 3
pkm Regexproblem - Wie kann ich zwei oder mehr beliebige Zeichen matchen? Java Basics - Anfänger-Themen 7
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
Dimax Erste Schritte String replace alle Zeichen Java Basics - Anfänger-Themen 10
M Regex-Ausdruck: Alle Zeichen bis auf ein bestimmtes erlauben (p{L}) Java Basics - Anfänger-Themen 5
M Regex für bestimmte Wörter bzw. bestimmte Zeichen erstellen Java Basics - Anfänger-Themen 5
F RegEx "+" nur als Zeichen, nicht als Operator oder Sonstiges Java Basics - Anfänger-Themen 2
J Zeichen im String zählen Java Basics - Anfänger-Themen 3
J ObjectOutputStream writeChars, komische Zeichen nur in 1. Zeile Java Basics - Anfänger-Themen 2
H Fehlerausgabe (Ungewollte Zeichen) Java Basics - Anfänger-Themen 1
R Komische Zeichen in Java Java Basics - Anfänger-Themen 5
N Zeichen in einem Textfeld zählen und hinterlegen Java Basics - Anfänger-Themen 6
W Einfachen, ein beliebiges Zeichen oft erkennenden Regex Parser selber schreiben - wie vorgehen? Java Basics - Anfänger-Themen 12
J Vorkommen von Zeichen Java Basics - Anfänger-Themen 44
H Verschiebung von Zeichen Java Basics - Anfänger-Themen 18
O String von vorne nach hinten an einem Zeichen Java Basics - Anfänger-Themen 10
S char auf buchstabe/zeichen prüfen Java Basics - Anfänger-Themen 1
P Zeichenkette Zeichen ausschlißen funktioniert nicht richtig Java Basics - Anfänger-Themen 9
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
L String auf bestimmte zeichen untersuchen Java Basics - Anfänger-Themen 9
D gebe string zurück mit von bis bestimmtes Zeichen Java Basics - Anfänger-Themen 4
L Rekursion größtes Zeichen Java Basics - Anfänger-Themen 8
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
Y String auf allgemein Zeichen untersuchen Java Basics - Anfänger-Themen 3
S String trennen nach beliebigen Zeichen Java Basics - Anfänger-Themen 3
C Zeichen im String bis zu bestimmter Stelle entfernen Java Basics - Anfänger-Themen 6
S Java Text splitten mit Tabs, Zeilen, Zeichen und Klammern. Java Basics - Anfänger-Themen 6
H Zeichen im algorithmus Java Basics - Anfänger-Themen 4
S Das Anführungszeichen(") Zeichen in einen String setzen Java Basics - Anfänger-Themen 1
G Zeichen suchen und Ausgeben. Java Basics - Anfänger-Themen 3
D Input/Output Split am Zeichen | Java Basics - Anfänger-Themen 2
B zeichen eines String mit der kleinsten Frequenz zurückgeben Java Basics - Anfänger-Themen 25
m0n4ch Variablen String auf ungültige Zeichen überprüfen Java Basics - Anfänger-Themen 13
Voreck String Zeichen für Zeichen auslesen Java Basics - Anfänger-Themen 9
R Zeichen in String vergleichen Java Basics - Anfänger-Themen 75
G Gibt es eine Methode die bei einem StringBuilder n mal das Zeichen c hinzufügt? Java Basics - Anfänger-Themen 6
D String Zeichen für Zeichen auslesen Java Basics - Anfänger-Themen 5
S Zeichen ab Suchstring einlesen Java Basics - Anfänger-Themen 6
Z char Array unbekanntes Zeichen selbstständig anlegen Java Basics - Anfänger-Themen 6
M Pipe-Zeichen "|" in Java Java Basics - Anfänger-Themen 1
S Zeichen von abgerundeten Rechtecken auf einem Applet Java Basics - Anfänger-Themen 5
R Anzahl von Zeichen in einem Char Array Java Basics - Anfänger-Themen 4
F StringBuilder: Zeilenumbruch nach x Zeichen ohne Worttrennung Java Basics - Anfänger-Themen 1
F Zeichen einer Datei zaehlen Java Basics - Anfänger-Themen 1
D Java doppelte Zahl/Zeichen in einem String entfernen Java Basics - Anfänger-Themen 6
W JTextField-Objekt liest Umlaute mit falschen Zeichen ein Java Basics - Anfänger-Themen 5
G zeichen einer Zeile löschen Java Basics - Anfänger-Themen 4
M problem mit diesem zeichen | Java Basics - Anfänger-Themen 10
N Bestimmte Zeichen eines Strings umwandeln Java Basics - Anfänger-Themen 4
W char-Array auf bestimmte Zeichen prüfen Java Basics - Anfänger-Themen 10
B lanterna einzelne Zeichen aus dem Terminal löschen Java Basics - Anfänger-Themen 0
S Input/Output Alphabet in eine Datei schreiben und Anzahl von Zeichen ausgeben. Java Basics - Anfänger-Themen 4
C Anzahl bestimmter Zeichen in einem String ausgeben Java Basics - Anfänger-Themen 7
I String abschneiden erste und letzte Zeichen Java Basics - Anfänger-Themen 3
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
S Leerzeichen zwischen zwei Zeichen im String entfernen Java Basics - Anfänger-Themen 19
F Methoden split() - Mehrere Zeichen Java Basics - Anfänger-Themen 5
M Input/Output Text auf Fenster zeichen Java Basics - Anfänger-Themen 2
F In einem String nach einem String suchen und Zeichen danach ausgeben Java Basics - Anfänger-Themen 6
S Kleines Zeichen berechnen Java Basics - Anfänger-Themen 5
Q Erste Schritte Zeichen in String farblich hervorheben Java Basics - Anfänger-Themen 4
U markierten Text auf Zeichen zuvor/danach pruefen Java Basics - Anfänger-Themen 9
M Input/Output Zeichen on Konsole einlesen Java Basics - Anfänger-Themen 3
DStrohma Operatoren Kleiner-Zeichen in Größer-Zeichen ändern wenn boolen true? Java Basics - Anfänger-Themen 6
G Input/Output Verhalten BuffferedReader bei unvollständigen Zeichen Java Basics - Anfänger-Themen 1
T Auf jedes Zeichen eines Strings zugreifen? Java Basics - Anfänger-Themen 2
P String Zeichen zuweisen Java Basics - Anfänger-Themen 3
Q Erste Schritte In CharArrayWriter Zeichen an Stelle einfügen Java Basics - Anfänger-Themen 4
H Programm zum Zählen von Zeichen Java Basics - Anfänger-Themen 5
P Methode die String auf Zeichen überprüft Java Basics - Anfänger-Themen 2
A Seltsame Zeichen vor Clienteingabe Java Basics - Anfänger-Themen 5
M Prüfen, ob Zeichen eine Zahl ist Java Basics - Anfänger-Themen 3
T Wörter mit @ als Zeichen finden Java Basics - Anfänger-Themen 13
E Zeichen von Kommandozeilenparameter zählen Java Basics - Anfänger-Themen 6
W String von hinten alle drei Zeichen abschneiden und in umgekehrter Reihenfolge ausgeben. Java Basics - Anfänger-Themen 9
J String Ausgabe nicht-leerer Zeichen nicht korrekt Java Basics - Anfänger-Themen 10
H JEditorPane: ermitteln, ob Zeichen unterstrichen Java Basics - Anfänger-Themen 4
I Zeichen aus String ziehen Java Basics - Anfänger-Themen 3
X Klassen mit Suffix hinter @-Zeichen Java Basics - Anfänger-Themen 7
J Zeichen aus String Array lesen Java Basics - Anfänger-Themen 13
P Input/Output Textdatei einlesen - 1. Zeichen fehlt Java Basics - Anfänger-Themen 7
S Zeichen von Telnet lesen Java Basics - Anfänger-Themen 5
B Strings nur aus bestimmten Zeichen? Java Basics - Anfänger-Themen 4
T String - kleinstes Zeichen bestimmen Java Basics - Anfänger-Themen 3
M Einzelne Zeilen nach Zeichen auslesen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben