2016-05-31 2 views
-3

У меня есть ситуация, когда я читаю из файла, который содержит специальные символы, такие как $ @%! вместе с пробелами. например:java - печать специальных символов и пробелов на выходе

I_am_here !!! на самом деле, __ am_I_here?

В строке выше я показываю пробел с подчеркиванием, чтобы показать, что я могу встретить несколько пробелов (например, два до утра), а также специальные символы. Поэтому я просто использую _ как визуальную помощь. В реальном файле это просто пробел или несколько пробелов.

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

, например, входная строка:

I_am_here !!! на самом деле, __ am_I_here?

станет:

I_am_here !!! на самом деле, __ 2_I_2?

Здесь я читаю входную строку, считая слова, которые встречаются более одного раза, и распечатываем вывод вместе с пробелами и специальными символами, которые произошли в исходном вводе. Как я могу сделать это на Java? thanks

+1

как делает ваш написанный код выглядит? –

+1

Вы пробовали что-нибудь о чтении из файла и используете регулярное выражение? показывая, что вы сделали до сих пор, было бы лучше. – jcool

+0

* «Как я могу прочитать этот файл со входа?» * Точно так же вы обычно читаете текстовые файлы: с помощью ['FileReader'] (https://docs.oracle.com/javase/7/docs/api/java/ io/FileReader.html), возможно, завернутый с помощью ['BufferedReader'] (https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html) для легкого чтения строк с использованием [' ReadLine() '] (https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine%28%29). – Andreas

ответ

0

Чтобы найти слова в строке, проще всего использовать регулярное выражение. Регулярное выражение \p{L}+ найдет любую последовательность из одной или нескольких букв Unicode.

Чтобы заменить такие слова значением, которое не известно до тех пор, пока слово не будет найдено, вы можете использовать методы appendReplacement() и appendTail()Matcher, используемые для поиска слов.

Поскольку вы хотите подсчитать, сколько раз ранее было замечено слово, вы можете использовать Map<String, Integer> для сохранения карты уже замеченных слов и подсчета количества раз, сколько это было видно до сих пор.

Вот как это будет работать:

String input = "I am here!!! really, am I here? Why, yes I really am!"; 

Map<String, Integer> wordCount = new HashMap<>(); 
StringBuffer buf = new StringBuffer(); 
Matcher m = Pattern.compile("\\p{L}+").matcher(input); 
while (m.find()) { 
    String word = m.group(); 
    Integer count = wordCount.get(word); 
    if (count == null) 
     wordCount.put(word, 1); 
    else { 
     wordCount.put(word, ++count); 
     m.appendReplacement(buf, count.toString()); 
    } 
} 
String output = m.appendTail(buf).toString(); 

System.out.println(input); 
System.out.println(output); 

ВЫВОД

I am here!!! really, am I here? Why, yes I really am! 
I am here!!! really, 2 2 2? Why, yes 3 2 3! 
Смежные вопросы