2012-01-04 3 views
1

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

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

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

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

String s = "abcdefghijklmnopqrstuvwxyz1234567890,.)(/\\<>[email protected]#$%^&*_-+=\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

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

+0

И в чем же проблема, с которой вы столкнулись? (например, как ваша фактическая разница в выходе от вашего идеала?) – maerics

+2

Не используйте catch (NullPointerException), чтобы обрабатывать случай, когда символ отсутствует на карте. Проверьте, если count.get (c) возвращает null. Это намного легче читать, а также быстрее. Исключения для исключительных случаев. –

+0

Основная проблема заключается в применении этой логики к большому файлу, а не к короткой строке. Что касается выхода, моя, похоже, смешана, идеал должен был ее заказать. Спасибо за отзыв (NullPointerException) JB! –

ответ

1

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

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

+0

Я не уверен, как читать файл по одному символу за раз, и я не был ' t уверен, что метод HashMap будет работать для очень больших файлов (1 ГБ +).Очень новичок в этом, спасибо за отзывы! –

+0

Как отметил также @JB Niznet, ваши результаты не упорядочены, потому что HashMap не упорядочен. (или, по крайней мере, не так, как вы ожидаете). Он также описал, как «читать один символ за раз» при буферизации для производительности. – user949300

0

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

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

Смежные вопросы