Java String Buchstaben mit kleinster Anzahl finden

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.

 


Mehtool 
Beitragsersteller
 25.04.2015, 17:11

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. =/

0
Mehtool 
Beitragsersteller
 25.04.2015, 17:14
@Mehtool

hat sich schon erledigt. Danke trotzdem

0
Mehtool 
Beitragsersteller
 25.04.2015, 18:27
@Mehtool

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

0
safur  25.04.2015, 18:58
@Mehtool

Welchen String hast du für den Test denn übergeben? Ich hoffe nicht den langen, wenn du nur die Größe 2 vergibst.

Was hast du SampeText übergeben?

0
safur  25.04.2015, 19:06
@safur

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?

0
safur  25.04.2015, 19:27
@safur

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

 

0
Mehtool 
Beitragsersteller
 26.04.2015, 14:27
@safur

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!

0
Mehtool 
Beitragsersteller
 26.04.2015, 14:34
@Mehtool

Meine Schuld. Ich habe den Array falsch interpretiert. Irgendwie hatte ich noch im Kopf dass man den Y Wert als erstes angibt und nicht den X Wert. Wie dumm von mir. Sorry

0
safur  26.04.2015, 15:10
@Mehtool

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.

0

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.


TUrabbIT  25.04.2015, 17:32

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 ;)

0