Распределение числа / частот встречаемости символов в файле, в том числе невидимых - PullRequest
1 голос
/ 05 января 2012

Моя цель - создать распределение частот каждого символа в больших плоских файлах (1 ГБ +) для последующего импорта базы данных. В идеале на выходе должен быть список символов ASCII, каждый из которых следует за счетом.

В настоящее время я использую хэш-карту для создания распределения каждого значения в строке, и это отчасти работает, я просто не знаю, как реализовать это в большом файле. Кроме того, в моем выводе символы CR и LF (или / r / n) приводят к новой строке со счетом на следующей.

Вот текущий код:

public class CharCount{
public static void main(String[] args) {

String s = "abcdefghijklmnopqrstuvwxyz1234567890,.)(/\\<>?!@#$%^&*_-+=\r\n";

char[] arr = s.toCharArray();

HashMap <Character,Integer> count = new HashMap<Character, Integer>();

for (char c : arr) {

try {
count.put(c, count.get(c)+1);
} catch (NullPointerException e) {

count.put(c, 1);
}
}

for (Character c: count.keySet()) {
System.out.println(c + " = " + (int)c + " = " + count.get(c));
}
}
}

Идеальный результат будет выглядеть примерно так:

000 NUL 4124435 001 SOH 0
002 STX 0
003 ETX 0
.....
253 х 0
254 þ 0
255 ÿ 0

Определенно ценю любую помощь!

Ответы [ 2 ]

1 голос
/ 05 января 2012

Если вы обрабатываете только символы ASCII, т. Е. В диапазоне 0-255, было бы проще просто иметь целочисленный (или, возможно, длинный) массив [256], а затем прочитать файл, по сути, char за раз (конечно, вы бы использовали буферизацию или NIO для скорости) и увеличивали соответствующую ячейку.

Тем не менее, ваш код HashMap выглядит разумно, и я не уверен, в чем ваш вопрос или проблема ???

0 голосов
/ 05 января 2012

Если вы уверены, что будете иметь дело только с данными ASCII, было бы намного быстрее реализовать это с использованием массива int[256], а не хеш-карты.

Относительно \r и \n, просто обрабатывайте их так, как будто вы обрабатываете другие символы ниже пробела.(Вы, вероятно, должны также обрабатывать пробел, печатая его имя, а не сам символ.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...