Подсчитать все символы в файле, включая \n и т. д.

Я пытаюсь перебрать текстовый файл и подсчитать все символы. Это включает в себя \n символы новой строки и все остальное. Я могу прочитать файл только один раз. Я также записываю частоту букв, количество строк, количество слов и т. д. Я не могу понять, где считать общее количество символов. (см. код ниже) Я знаю, что мне нужно, прежде чем использовать StringTokenizer. (Кстати, я должен использовать это). Я пробовал несколько способов, но просто не могу понять это. Любая помощь будет оценена по достоинству. Заранее спасибо. Примечание* моя переменная numChars считает только альфа-символы (a,b,c и т. д.). измените переменные класса публикации, чтобы сделать код более понятным

private final int NUMCHARS = 26;
private int[] characters = new int[NUMCHARS];
private final int WORDLENGTH = 23;
private int[] wordLengthCount = new int[WORDLENGTH];
private int numChars = 0;
private int numWords = 0;
private int numLines = 0;
private int numTotalChars = 0;
DecimalFormat df = new DecimalFormat("#.##");

public void countLetters(Scanner scan) {
    char current;
    //int word;
    String token1;

    while (scan.hasNext()) {

        String line = scan.nextLine().toLowerCase();
        numLines++;

        StringTokenizer token = new StringTokenizer(line,
            " , .;:'\"&!?-_\n\t12345678910[]{}()@#$%^*/+-");
        for (int w = 0; w < token.countTokens(); w++) {
            numWords++;
        }

        while (token.hasMoreTokens()) {
            token1 = token.nextToken();
            if (token1.length() >= wordLengthCount.length) {
                wordLengthCount[wordLengthCount.length - 1]++;
            } else {
                wordLengthCount[token1.length() - 1]++;

            }

        }
        for (int ch = 0; ch < line.length(); ch++) {
            current = line.charAt(ch);
            if (current >= 'a' && current <= 'z') {
                characters[current - 'a']++;
                numChars++;

            }
        }
    }
}

person Community    schedule 18.07.2013    source источник


Ответы (2)


Используйте string.toCharArray (), например:

while (scan.hasNext()) {
    String line = scan.nextLine();
    numberchars += line.toCharArray().length;
    // ...
}

Альтернативой может быть прямое использование string.length:

while (scan.hasNext()) {
    String line = scan.nextLine();
    numberchars += line.length;
    // ...    
}

Используя BfferedReader, вы можете сделать это следующим образом:

BufferedReader reader = new BufferedReader(
    new InputStreamReader(
        new FileInputStream(file), charsetName));
int charCount = 0;
while (reader.read() > -1) {
    charCount++;
}
person CloudyMarble    schedule 18.07.2013
comment
String.length работает почти. Если я использую scan.nextLine().length, он выдает ошибку времени выполнения Exception в потоке main java.util.NoSuchElementException: строка не найдена в java.util.Scanner.nextLine(Scanner.java:1533). at TextStatistics.countLetters(TextStatistics.java:28) at ProcessText.main(ProcessText.java:25) --- Вместо этого я просто использую numTotalChars += line.length(); Это почти там. Он по-прежнему не захватывает \n (символ новой строки), но я думаю, что могу просто добавлять 1 каждый раз, когда он захватывает строку. - person ; 18.07.2013
comment
Этот ответ также очень полезен. Однако для этого проекта мне не разрешили использовать буферизованный ридер. Но это было хорошее знание, чтобы учиться в любом случае. Спасибо за комментарий. - person ; 19.07.2013

Я бы читал char из файла с помощью BufferedReader и использовал бы Guava Multiset для подсчета символов.

BufferedReader rdr = Files.newBufferedReader(path, charSet);
HashMultiset < Character > ms = HashMultiset.create();
for (int c;
(c = rdr.read()) != -1;) {
    ms.add((char) c);
}
for (Multiset.Entry < Character > e: ms.entrySet()) {
    char c = e.getElement();
    int n = e.getCount();
}
person Evgeniy Dorofeev    schedule 18.07.2013
comment
Это имеет смысл, но в спецификациях мы не можем использовать BufferedReader. Но, спасибо за ваш вклад. Это заставило меня задуматься. :) - person ; 18.07.2013