2017-05-28 2 views
0

Ich muss eine TXT-Datei vorbereiten und zählen, wie oft jedes Zeichen des Alphabets in der Datei auftritt. Ich habe ein sehr schönes Stück Code gefunden, aber leider funktioniert es nicht mit polnischen Zeichen wie ą, ê, ć, ó, ż, ź. Obwohl ich sie in das Array einfüge, werden sie aus irgendeinem Grund nicht in der TXT-Datei gefunden, daher ist die Ausgabe 0.Wie Vorkommen von polnischen Zeichen in TXT-Datei zu zählen

Weiß jemand warum? Vielleicht sollte ich sie anders zählen, mit "Switch" oder ähnlichem. Bevor jemand fragt - ja, wird die TXT-Datei mit UTF-8 :)

public static void main(String[] args) throws FileNotFoundException { 
     int ch; 
     BufferedReader reader; 
     try { 
      int counter = 0; 

      for (char a : "AĄĆĘÓBCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray()) { 
       reader = new BufferedReader(new FileReader("C:\\Users\\User\\Desktop\\pan.txt")); 
       char toSearch = a; 
       counter = 0; 

       try { 
        while ((ch = reader.read()) != -1) { 
         if (a == Character.toUpperCase((char) ch)) { 
          counter++; 
          } 
        } 

       } catch (IOException e) { 
        System.out.println("Error"); 
        e.printStackTrace(); 
       } 
       System.out.println(toSearch + " occurs " + counter); 

      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 
+1

Wenn die Testdatei UTF8-codiert ist, warum lesen Sie sie nicht mit der UTF8-Codierung, statt die Standardzeichencodierung Ihrer Plattform zu verwenden? Haben Sie das grundlegende Debugging durchgeführt, wie das Drucken (oder das Untersuchen mit dem Debugger) nach jedem gelesenen Zeichen, das Drucken (oder das Überprüfen mit dem Debugger) auf seinen Großbuchstaben? –

+0

Siehe [Anzahl der einzelnen Zeichen in einem String zählen] (https://codereview.stackexchange.com/q/44186/88267) oder möglicherweise [Anzahl der Vorkommen jedes einzelnen Zeichens] (https://stackoverflow.com/q/ 4112111/5221149) für eine Möglichkeit, die nicht die gesamte Datei mehrmals scannt. – Andreas

+0

@JBNizet Eine kurze Version der Antwort - Lehrerin hat uns gesagt, wir sollten es so machen. - Ich nehme an, sie hat nicht erwartet, dass es nicht funktioniert. Aaaaand nein, aber die Verwendung von "InputStreamReader" hilft. –

Antwort

3
gespeichert

wie Ihr Problem Sieht Codierung und Standard-System im Zusammenhang charset

try Leser Variable auf diese

zu ändern
InputStreamReader reader = new InputStreamReader(new FileInputStream("C:\\Users\\User\\Desktop\\pan.txt"), "UTF-8"); 
+0

Danke! Es klappt! –

0

try this: ich schlage vor, dass Sie NIO verwenden und diesen Code habe ich für Sie geschrieben NIO verwenden, Random und MappedByteBuffer, das ist schneller:

import java.io.IOException; 
import java.io.RandomAccessFile; 
import java.nio.MappedByteBuffer; 
import java.nio.channels.FileChannel; 
import java.util.HashMap; 
import java.util.Map; 

public class FileReadNio 
{ 
public static void main(String[] args) throws IOException 
{ 
    Map<Character, Integer> charCountMap = new HashMap<>(); 

    RandomAccessFile rndFile = new RandomAccessFile 
      ("c:\\test123.txt", "r"); 
    FileChannel inChannel = rndFile.getChannel(); 
    MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size()); 
    buffer.load(); 
    for (int i = 0; i < buffer.limit(); i++) 
    { 

     char c = (char) buffer.get(); 

     if (charCountMap.get(c) != null) { 
     int cnt = charCountMap.get(c); 
      charCountMap.put(c, ++cnt); 

     } 
     else 
     { 
      charCountMap.put(c, 1); 
     } 
    } 

    for (Map.Entry<Character,Integer> characterIntegerEntry : charCountMap.entrySet()) { 

     System.out.printf("char: %s :: count=%d", characterIntegerEntry.getKey(), characterIntegerEntry.getValue()); 
     System.out.println(); 
    } 

    buffer.clear(); 
    inChannel.close(); 
    rndFile.close(); 
} 
} 
Verwandte Themen