Java String Buchstaben mit kleinster Anzahl finden
Hallo ihr lieben,
nein ich möchte eine Lösung sonder ur einen kleinen Denkanstoss.
Ich habe seit 3Jahren kein Java mehr gemacht und muss mich jetzt wieder einarbeiten und sitze an folgender Aufgabe:
Ich bekomme einen String z.B. "AAaBBbbbZZZzzz" und der Code soll mir nun ausgeben dass a am seltensten vorkommt, also 1mal.
Jetzt habe ich folgende Idee komme aber nicht weiter: 1. Buchstaben nehmen -> String durchlaufen und zählen -> Buchstaben und anzah abspeichern. Nächsten Buchstaben nehmen, mit Vorhandenem, falls gleich weiter gehen, falls neu erneut zählen, bis der String zu Ende ist.
Jetzt habe ich aber irgendwie Probleme damit wie ich die Ergebnisse abspeicher, in einem Array?
Ist das ein akzeptabler Ansatz oder totaler Mist?
Bitte denkt daran dass ich praktisch nichts mehr von Java weiß, also blutiger Anfänger bin.
Bitte keine direkte Lösung schreiben, ich möchte selber was erarbeiten.
Vielen Dank für eure Hilfe
2 Antworten
Ich würde mir wohl ein zweidimensionales int-Array nehmen.
int[][] frequency;
frequency= new int [size][size];
In Spalte 1 würde ich mir den Ascii-Code des Buchstabens schreiben, in Spalte 2 die Anzahl des Buchstabens.
Ich meine in Java war es sogar möglich Buchstabenkonstanten direkt an Int zu übergeben.
Dein Vorgehen finde ich ok:
i=0
Speicher Buchstabe in Array, setze ggf. Vorkommen +1
i=1
Durchlaufe dein Array ob Buchstabe bekannt, wenn bekannt Vorkommen + 1
i=2
Durchlaufe dein Array ob Buchstabe bekannt. Nicht bekannt, Speichere Buchstabe in Array, setzte ggf. Vorkommen +1
Am Ende flitzt du nur die Vorkommensspalte durch und merkst dir den Index der kleinsten Zahl. Ausgabe des Buchstabens an der Position.
bin auf folgendes Problem gestoßen:
public void sampleMethod(String text) { IllegalArgumentException ex; if ((text.isEmpty()== false)) { int [][] freq = new int[2][text.length()]; int i; int a; i = 0; freq[i][0]=(int)(text.charAt(i)); // Buchstaben in den Array schreiben freq[i][1]= 0; // Anzahl auf 1 gesetzt // String durchlaufen int l; for (l=0; l<= text.length(); l++){ if( freq[0][0] == text.charAt(l)){ (freq[1][0])++; } } System.out.println("Erster Buchstabe"+ (char)(freq[0][i]) + "Anzahl :)" + freq[1][i]); } else { ex = new IllegalArgumentException("String ist leer"); throw ex; }
Das Array sollte wie folgt aussehen
(Buchstabe1),(Buchstabe2) ....
(Anzahl Buchstabe1), (Anzahl Buchstabe2)
Dann wollte ich erstmal den ersten Buchstaben zählen um zu überprüfen ob das funktioniert. Also freq[0][0] auf den Buchstaben und freq [1][0] auf 0 (um diese int dann zu erhöhen).
Nun wirft er mir hier aber eine
java.lang.StringIndexOutOfBoundsException: String index out of range: 7
bei text.charAt(l)
kann mir nicht erkläre warum
Ich würde hier:
int [][] freq = new int[2][text.length()];
das eher so initialisieren:
int [][] freq = new int[text.length()][1];
Falls alle Buchstaben genau einmal vorkommen hast du die Größe des Strings für die Buchstaben gesetzt. Hinten kommt doch nur die Anzahl rein. Da brauchst du nur eine Dimension.
Dein Array sieht intern dann so aus:
A 2
b 3
D 4
Verstehst du?
Ich hab mich mal etwas versucht. Es fehlt noch immer die Laufschleife für i, meine Anregungen siehst du immer hinter ###
public void sampleMethod(String text) {
IllegalArgumentException ex;
if ((text.isEmpty()== false)) {
int [][] freq = new int[2][text.length()];
##int [][] freq = new int[text.length()][1];
## Zum Test: text = "AAaBBbbbZZZzzz";
int i;
int a;
i = 0;
freq[i][0]=(int)(text.charAt(i)); // Buchstaben in das Array schreiben
freq[i][1]= 0; // Anzahl auf 1 gesetzt
##Du setzt hier nichts auf 1?
// String durchlaufen
int l;
for (l=0; l<= text.length(); l++){
if( freq[0][0] == text.charAt(l)){
(freq[1][0])++;
##Diese Dimension hast du nie initialisiert. Du meinst hier freq[0][1]
}//end if
}//end for
System.out.println("Erster Buchstabe"+ (char)(freq[0][i]) + "Anzahl :)" + freq[1][i]);
## Hier brauchst du bei Anzahl freq[0][1] oder freg[i][1]
}else{
ex = new IllegalArgumentException("String ist leer");
throw ex;
}//end else
}//end sampleMethod
Ich habe andersrum gedacht.
Bei dir gibt es im Array nur 2 Spalten und viele Zeilen (Länge des Textes)
A / 1
B / 0
...
Ich wollte 2 Zeilen und viele Spalten
A / B / C ...
1 / 0 / 1 ...
Ich versuche mal deine Version aber das sollte so rum doch auch möglich sein oder?
As Testwort habe ich "HHHaallllooo" benutzt.
Achja. Danke Danke Danke Danke fürs helfen!
Grundsätzlich könntest du das Array natürlich drehen. So ganz logsich würde ich es jedoch nicht finden. Du möchtest ja einen Bezug herstellen zwischen einer gegebenen Konstante (Menge an Buchstaben) und deren Aufkommen abbilden. Deine Buchstaben fungieren also als Schlüssel-Feld. Ein Schlüsselfeld schreibt man in unseren Breiten gewöhnlich links und hängt dann rechts variable Werte hin.
Math. funktioniert es natürlich auch andersherum.
Wenn du weißt was für Zeichen möglich sind könntest du den String als char-Array mit einer for-each Schleife durchlaufen und darin ein switch-case machen.
ansonsten: mach dir eine Klasse mit einem char Attribut und einem int Attribut, sowie get/set Methode für das Zeichen, einer increase Methode und einer get Methode für den count. Dann eine arrayList mit der Klasse als Typ. Dann kannst du den String als char-Array durchlaufen und für jedes Zeichen prüfen ob es schon vorkommt und wenn den Zähler erhöhen ansonsten ein neues Objekt erstellen und der Liste hinzufügen. du könntest damit sogar die Positionen der Elemente speichern. ist zwar aufwändiger aber schöner ;)
danke für die schnelle Antwort.
Vielleicht kannst du mir noch mal weiterhelfen.
Ich habe eine kleine Testklasse programmiert um den output zu testen.
Ich muss BlueJ benutzen. In meinem Code habe ich System.out.println(i); benutzt. Wenn ich jetzt compiliere, müsste das programm mir nicht eigentlich den Wert von i ausgeben? Weil ich nur die info bekomme, dass es fehlerfrei compiliert. =/