Häufigkeit von Zeichen feststellen



  • Hi,
    Ich habe einen einzugebenden Text, der dann in einem char-Array vorliegt, und da will ich jetzt die Häufigkeit der einzelnen Zeichen herausfinden. Dazu habe ich mir folgende Funktion geschrieben.
    Dabei ist len ("global"), die Länge des Arrays, und cnt wurde "global" (also vor main) mit -1 initialisiert.

    static char[][] HaeufigkeitBerechnen(char tabelle[][], char text[])
    	{
    		// gleiche länge wie char array  
    		// true = zeichen kommt zum ersten mal vor in häufigkeit
    		// false = zeichen kommt schon vor in häufigkeit
    		boolean helpArray[] = new boolean[len];
    		for (int n=0; n<len; n++) 
    			helpArray[n] = true;
    
    		for (int i=0; i<len; i++)
    		{
    			if (helpArray[i] == true)
    			{
    				cnt++;
    				tabelle[cnt][0] = text[i];
    
    			}
    
    			for (int j=i; j<len; j++)
    			{
    				if (text[i] == text[j])
    				{
    					tabelle[cnt][1]++;
    					helpArray[j] = false;
    				}
    			} 
    
    		}  // ende äußeres for
    
    		return tabelle;
    
    	}  // end function
    

    Um die Häufigkeiten der jeweiligen Buchstaben zu "speichern", benutze ich ein 2-dimensionales char Array. Darin speichere ich einerseits das Zeichen, und andererseits die Zahl wie oft es vorkommt (Da ich den einzugebenden Text auf 100 Zeichen beschränke ist das kein Problem mit char).
    Da ja ein Zeichen mehrere Male vorkommen kann, lege ich ein bool Array an mit genau gleich vielen Elementen wie Zeichen vorhanden sind. Wenn ein Zeichen mehrere Male vorkommt, dann belege ich die jeweiligen Elemten in dem bool Array mit false, damit ich weiß, dass ich diese Zeichen nicht mehr neuanzulegen brauche. Naja alles andere sollte ansonsten aus dem Code ersichtlich sein.
    Auf jeden Fall hab ich da irgendwas falsch gemacht, aber ich finde den oder die Fehler nicht. Weiß jemand wo der Fehler liegt ? Das wäre super



  • Hi

    irgendwie kann man sowas immer umständlich machen. ich hätte dazu nur ein Array of int verwendet, und den text von forne nach hinten durchgeackert. Der zeichenwert gibt den index des arrays an der incementiert werden soll. ( vorinitallisierung war 0). da Char aber eigentlich ein uniCode zeichen ist würde man 65536 einträge in dem Array benötigen. Da ich aber annehme, das du nur deutsche / mitteleuropäische Texte auswerten wirst, kann man das auf die untersten 8 bit reduzieren.

    int [] getHaeufigkeit(char text [])
    {
      int [] ret = new int[256];
    
      for (int i = 0; i < ret.length; i++)
      {
        ret[i] = 0;
      }
    
      for (int i = 0; i < text.lenght; i++)
      {
        int pos = (int) (text[i] & 0x000000FF ); // kann sein das ich mich hier vertan hab.
    
        ret[pos]++;
      }
    
      return ret;
    }
    

    ps alle angaben ohne gewähr

    gruss



  • Hoi,

    Du kannst Dir auch ein char-Array mit 52 einträgen machen.
    Also alle kleinbuchstaben von a-z und alle grossbuchstaben von a-z.
    das geht ganz einfach in dem du ne for schleife (initial=35) durch nen char array laufen lässt:

    int zeile = 0;
    int spalte = 0;
    for(int a=35; a < 87; a++)
    {
       charArray[zeile][spalte]= (char)a;
       zeile++;
    }
    

    Den eingegebenen text durchläufst Du mit charAt(index) und vergleichst jede Stelle mit dem charArray, falls .equals == true ist, zählst du die entsprechenden stelle hoch.

    Hab jetzt nix gestestet, war nen erster gedaklicher erguss 😉

    greetz
    SLi


Anmelden zum Antworten