Мне кажется, что вы не хотите фильтровать, используя что-либо, кроме пробелов и конечных строк. Например, слово «они» будет возвращаться как два слова, если вы используете «, чтобы отфильтровать количество слов. Вот как можно изменить исходный код, чтобы он работал.
Scanner fileScanner = new Scanner(new File("C:\\MyJavaFolder\\JavaAssignment1\\TestFile.txt"));
int totalWordCount = 0;
ArrayList<String> words = new ArrayList<String>();
//Firstly to count all the words in the file without the restricted characters
while (fileScanner.hasNext()) {
//Add words to an array list so you only have to go through the scanner once
words.add(fileScanner.next());//This defaults to whitespace
totalWordCount++;
}
System.out.println("There are " + totalWordCount + " word(s)");
fileScanner.close();
Использование Pattern.compile()
превращает вашу строку в регулярное выражение. Символ '\ s' предопределен в классе Pattern для соответствия всем символам пробела.
Больше информации на
Шаблон документации
Кроме того, не забудьте закрыть свои классы сканера, когда вы закончите. Это может помешать открытию второго сканера.
Редактировать
Если вы хотите считать буквы за слово, вы можете добавить следующий код к приведенному выше коду
int totalLetters = 0;
int[] lettersPerWord = new int[words.size()];
for (int wordNum = 0; wordNum < words.size(); wordNum++)
{
String word = words.get(wordNum);
word = word.replaceAll("[.,:;()?!\" \t\n\r\']+", "");
lettersPerWord[wordNum] = word.length();
totalLetters = word.length();
}
Я проверил этот код, и он, кажется, работает для меня. replaceAll
, согласно JavaDoc , использует регулярное выражение для сопоставления, поэтому оно должно совпадать с любым из этих символов и по существу удалять его.