char Array unbekanntes Zeichen selbstständig anlegen

zenpaticx

Mitglied
Hallo,

unter dem Titel kann man sich zwar nicht ganz vorstellen was ich meine, aber vielleicht kann man ja die Richtung nachvollziehen 🙂.
Ich möchte ein Programm schreiben, was anhand eines Textes erkennt, welche Sprache verwendet wird (anhand der prozentualen Häufigkeit von Buchstaben et cetera). Damit man nicht jedes Zeichen selbst anlegen muss (A,a,B,b,á, é, usw...), wollte ich gerne eine Textdatei jeden Buchstaben durchgehen und dann in ein Array anlegen. Gibt es diesen Buchstaben in dem Array schon, soll er hochgezählt werden (Anzahl), gibt es ihn nicht, dann soll er angelegt werden und ein Wert aufgezählt werden. Hierbei kommt auch schon das erste Problem was ich mir denke (aber vielleicht gibt es ja auch dafür eine Lösung). Den zusätzlichen Char im Array anzulegen dürfte nicht schwer sein, wie soll das aber mit der Variablen zum Hochzählen gemacht werden? Die muss ja auch irgendwie deklariert werden..

Den Code den ich jetzt habe, wollte ich auch schon mal posten (Vorsicht: nicht sehr professionell 😀)

Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;

import javax.swing.JFileChooser;


public class Buchstabenerkennung {

   public static void main(String[] args) throws IOException {
     // TODO Auto-generated method stub
     
     BufferedReader br = null;
     String curline;
     
     char[] cArray = new char[500];
     
     br = new BufferedReader(new FileReader("C:/Desktop/Java/Text/Inhalt.txt"));
    while((curline = br.readLine()) != null){
       for(int i = 0; i < cArray.length; i++){
         char c = curline.charAt(i); //Das liegt bestimmt an der Zeile wegen curline.charAt(i)
         if(cArray[i] == c){
           System.out.println("Yep - " + c);
         } else{
           cArray[i] = c;
         }
         
       }
       
       
    }

Es kommt übrigens eine OutOfBoundsException.

Vielen Dank!
 
Du benutzt i gleichzeitig als Index für curline als auch dein char-Array. Wenn deine Zeile weniger Zeichen hat als dein Array groß ist, dürfte da eine OutOfBounds Exception fliegen.

Ein Char ist im Prinzip ja auch bloß eine Zahl, also kannst du den Char theoretisch einfach als Array-Index nutzen und das Feld an der entsprechenden Stelle hochzählen. Allerdings klappt das auch nur gut für die normalen europäischen Sprachen. Wenn du z.B. russisch oder andere asiatische Sprachen mit einbeziehen willst, hast du irgendwann mehr als 500 verschiedene Zeichen, und vor allem auch welche, deren Charaktercode deutlich höher liegen kann. Gilt auch für bestimmte Sonderzeichen, wie z.B. mathematische Symbole.
Statt dem Array kannst du z.B. auch einfach eine HashMap mit einem Char als Schlüssel verwenden. Damit hättest du keine Begrenzung für die Anzahl der Zeichen.
 
Du kannst entweder Map<Character,Integer> oder new int[Character.MAX_VALUE+1] nutzen.
Bei der Map #merge, beim array einfach ++ zum zählen, mit dem aktuellem Character als key bzw index.

Wenn du den Zähler in einer extra Klasse kapselst und einfach eine inc(char c) bereitstellst, kannst du beides mal testen, und hast den Teil gleich von Einlesen getrennt 😉

Das Einlesen könntest du einfach mit #read machen, damit liest dz Zeichenweise und nicht Zeilenweise, und musst die dann auch nicht noch durchgehen 😉
 
Abend,

ich habe den Programmteil soweit fast fertig, der die Chars und die Werte verknüpft. Mit kurzer Recherche ist die Idee mit einer HashMap wirklich gut.

Der Code ist folgender:
Java:
  public static void main(String[] args) {
     // TODO Auto-generated method stub
    
     HashMap<Character, Integer> hMap = new HashMap<Character, Integer>();
     String str = new String("Das ist ein sehr langer Text");
     for(int j = 0; j < str.length(); j++){
       char c = str.charAt(j);
      
       if(hMap.get(c) == null){
         hMap.put(c, 1);
       } else{
         int i = hMap.get(c);
         i++;
         hMap.put(c, i);
         //System.out.println("Der Buchstabe " + c + " kommt so oft vor: " + hMap.get(c));
       }
      
     }
    
     for(int p = 0; p < str.length(); p++){
       char c = str.charAt(p);
       if(hMap.get(c) != null){
         System.out.println("Der Buchstabe " + c + " kommt so oft vor: " + hMap.get(c));
       }
     }
    
   }

Jemand eine Idee, wie ich dafür sorge, dass nicht bspw. der Buchstabe "e" vier mal unten ausgegeben wird? Also dass er sozusagen einen finalen Zählerstand ausgibt? Weil in der unteren for-Schleife wird ja jeder Buchstabe - auch wenn er doppelt ist - ausgegeben mit der Anzahl, was ich persönlich nicht optimal finde.

Anregungen reichen!

Danke 🙂
 
Du kannst dir aus der Map alle keys holen, also alle vorkommenden Buchstaben, und für diese die Anzahl ausgeben (oder das entrySet nutzen).
 

Zurück
Oben