Как посчитать количество вхождений символа в строке?
Я имею строку
a.b.c.d
и хочу подсчитать количество вхождений символа '.' на идиоматичном уровне, предпочтительно в виде однострочного решения.
(Ранее я выразил это ограничение как "без использования цикла", если вы задаетесь вопросом, почему все пытаются ответить без цикла).
5 ответ(ов)
Вот такой вариант. Он не использует регулярные выражения, так что должен быть быстрее, чем некоторые другие решения, и не использует цикл.
int count = line.length() - line.replace(".", "").length();
Этот код подсчитывает количество точек в строке line
за счет сравнения длины оригинальной строки и строки без точек.
Рано или поздно что-то должно быть в цикле. Вам гораздо проще написать (очень простой) цикл, чем использовать что-то вроде split
, что гораздо мощнее, чем вам на самом деле нужно.
Вы можете инкапсулировать цикл в отдельном методе, например:
public static int countOccurrences(String haystack, char needle) {
int count = 0;
for (int i = 0; i < haystack.length(); i++) {
if (haystack.charAt(i) == needle) {
count++;
}
}
return count;
}
Таким образом, вам не нужно будет иметь цикл в основном коде, но цикл все равно должен быть где-то в вашем решении.
Чтобы подсчитать количество точек в строке, можно использовать метод replaceAll
для замены всех символов, кроме точки, на пустую строку, а затем получить длину результирующей строки. Вот пример кода на Java, который делает это:
String s = "a.b.c.d";
int charCount = s.replaceAll("[^.]", "").length();
System.out.println(charCount);
В этом коде replaceAll("[^.]", "")
заменяет все символы, кроме точки (.
), на пустую строку, в результате чего остаются только точки. Затем метод length()
возвращает количество оставшихся символов, то есть количество точек в строке.
В приведенном вами коде вы создаете строку s
со значением "a.b.c.d"
и затем используете метод chars()
для получения потокового представления символов строки. Далее применяете метод filter
, чтобы выбрать только те символы, которые равны '.'
, и в конце используете count()
, чтобы подсчитать количество отфильтрованных символов.
В результате переменная result
будет содержать количество точек в строке s
. В данном случае, результатом будет значение 3
, так как в строке "a.b.c.d"
три точки.
Если у вас есть дополнительные вопросы по данному коду или нужна помощь с чем-то еще, не стесняйтесь спрашивать!
Ваше "идиоматическое однострочное" решение выглядит следующим образом:
int count = "a.b.c.d".length() - "a.b.c.d".replace(".", "").length();
Я не понимаю, почему решение с использованием StringUtils было принято.
Ваш подход довольно элегантен, так как он использует методы length()
и replace()
, чтобы легко подсчитать количество точек в строке. Это позволяет избежать дополнительной зависимости от сторонних библиотек, что делает код более чистым и понятным.
С другой стороны, решение с StringUtils может быть менее интуитивным и более громоздким, особенно если нет явной необходимости в его использовании.
Как преобразовать строку в int в Java?
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как сгенерировать случайную алфавитно-цифровую строку
Java 8: Преобразование List<V> в Map<K, V>
Как преобразовать символ в строку?