2016-11-29 3 views
1

Я только начинаю задание по кодировке Хаффмана. Первый шаг - реализовать некоторую форму обработки файлов, которая будет считываться в обрабатываемом файле, а затем выполнять подсчет частоты символов.Прочитать в файле и распечатать частоту письма

У меня есть несколько различных текстовых файлов, чтобы проверить это против - некоторые буквы, цифры, символы, прописные буквы, строчные буквы и т.д.

Вот то, что я до сих пор:

import java.io.*; 
public class LetterFrequency { 
int nextChar; 
char c; 
public static void main(String[] args) throws IOException { 
    File txtfile = new File("10000random.txt"); 
    BufferedReader in = new BufferedReader (new FileReader (txtfile)); 
     System.out.println("Letter Frequency:"); 

    int[] count = new int[26]; 

    while ((nextChar = in.read()) != -1) { 
     ch = ((char) nextChar); 
     if (ch >= 'a' && ch <= 'z') 
     count[ch - 'a']++; 
    } 


    for (int i = 0; i < 26; i++) { 
     System.out.printf("%c %d", i + 'A', count[i]); 
    } 



in.close(); 

} 

Это, очевидно, базовую версию (просто обработку az), как бы это изменить, чтобы включить все заглавные буквы, цифры, символы и т. д. Не похоже, чтобы угадать размер массива.

Извините, если это очевидный вопрос, я все еще учась! Спасибо

+0

Почему бы не создать разные массивы для прописных, строчных букв, цифр, символов и т. Д.? – rafid059

+1

в качестве альтернативы вы можете использовать карту , чтобы сохранить это, не зная символов, и встретите – nafas

+0

@nafas, но это не будет содержать символы в лексикографическом порядке. – rafid059

ответ

0
String letterAsString = (ch+"").toUpperCase(); 

Это решение, если вы хотите, чтобы посчитать их точно так же, как строчные буквы.

1

Поддерживаются ли вы как однобайтовые, так и двухбайтовые символы? Только символы ASCII?

Если вы используете только ascii, у вас есть (26 * 2) + 10 возможных значений для всех нижних и верхних и цифровых цифр.

Если вы покрываете больше, чем просто ascii, вы можете использовать карту, а не массив.

Map<Integer, AtomicInteger> map = new HashMap<>(); 
... 
map.computeIfAbsent(ch, c -> new AtomicInteger()).getAndIncrement(); 
Смежные вопросы