Вхождение слова в строку (количество слов)
-
20-09-2019 - |
Вопрос
Я застрял на написании вхождения слова в строку.Я получил несколько советов (в примечаниях к задаче) по использованию compareToIgnoreCase.поэтому я попробовал что-то вроде этого:
splitwords = StringCont.split("\\s");
for(int i=0; i<splitwords.length; i++)
{
if(splitwords[1].compareToIgnoreCase(splitwords[i]) == 0)
splitcount++;
}
Это, конечно, как раз то, что я могу сделать, и, вероятно, плохой способ.Когда я запускаю код, я иногда выхожу из-за исключения массива, а иногда он запускается.Чего не хватает, так это:просмотрите все слова, проверьте их и пропустите слова, которые уже были подсчитаны.Я буду рад получить любую помощь с этим, чтобы продвинуться дальше и понять, как это можно закодировать.Спасибо вам :)
Редактировать:Кажется, я недостаточно четко объяснил проблему, но я получаю хороший ответ об объекте map, который легко собрал воедино то, что мне было нужно.Я не знал о карте.Так что да, я пытался определить, сколько раз каждое заданное слово встречается в строке.
tangens:это должно означать -возьмите первое слово (где есть первый пробел) splitwords[1] и сравните его со всеми другими словами в строке splitwords[i], и если оно равно 0 (равно), то count++.
Эско:там действительно есть пробелы, как в предложении.Но у меня все еще есть это исключение.Я не знаю, почему через.
Решение
Храните слова и их количество в Map
.
String[] words = string.toLowerCase().split("\\s+");
Map<String, Integer> wordCounts = new HashMap<String, Integer>();
for (String word : words) {
Integer count = wordCounts.get(word);
if (count == null) {
count = 0;
}
wordCounts.put(word, count + 1);
}
Обратите внимание, что я позвонил toLowerCase()
до того , как split()
поскольку вы, похоже, хотите использовать нечувствительность к регистру.
Другие советы
Ищете ли вы возникновение определенный слово в предложении или совокупное количество всех слов в предложении?Основываясь на вашем примере кода, я бы ожидал первого, но ваше объяснение заставляет меня думать о последнем.
В любом случае, что-то очевидное:Если во входной строке нет никаких пробелов, String#split()
возвращает массив, содержащий ровно один элемент - саму исходную строку.Поскольку индексы массива начинаются с нуля, это splitwords[1]
является причиной ArrayIndexOutOfBoundsException
потому что единственная доступная строка находится в index [0]
.
Вы можете использовать набор и сохранять каждое слово в нем, а в конце получить размер набора.
Вы получите количество разных слов не тот количество слов конечно.
Если вы хотите подсчитать количество встречаемости слов, вам следует использовать HashMap<String, Integer>
.Там вы можете сохранить счетчик для каждого найденного слова.