6

Как посчитать количество вхождений символа в строке?

1

Я имею строку

a.b.c.d

и хочу подсчитать количество вхождений символа '.' на идиоматичном уровне, предпочтительно в виде однострочного решения.

(Ранее я выразил это ограничение как "без использования цикла", если вы задаетесь вопросом, почему все пытаются ответить без цикла).

5 ответ(ов)

11

Вот такой вариант. Он не использует регулярные выражения, так что должен быть быстрее, чем некоторые другие решения, и не использует цикл.

int count = line.length() - line.replace(".", "").length();

Этот код подсчитывает количество точек в строке line за счет сравнения длины оригинальной строки и строки без точек.

1

Рано или поздно что-то должно быть в цикле. Вам гораздо проще написать (очень простой) цикл, чем использовать что-то вроде 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;
}

Таким образом, вам не нужно будет иметь цикл в основном коде, но цикл все равно должен быть где-то в вашем решении.

0

Чтобы подсчитать количество точек в строке, можно использовать метод replaceAll для замены всех символов, кроме точки, на пустую строку, а затем получить длину результирующей строки. Вот пример кода на Java, который делает это:

String s = "a.b.c.d";
int charCount = s.replaceAll("[^.]", "").length();
System.out.println(charCount);

В этом коде replaceAll("[^.]", "") заменяет все символы, кроме точки (.), на пустую строку, в результате чего остаются только точки. Затем метод length() возвращает количество оставшихся символов, то есть количество точек в строке.

0

В приведенном вами коде вы создаете строку s со значением "a.b.c.d" и затем используете метод chars() для получения потокового представления символов строки. Далее применяете метод filter, чтобы выбрать только те символы, которые равны '.', и в конце используете count(), чтобы подсчитать количество отфильтрованных символов.

В результате переменная result будет содержать количество точек в строке s. В данном случае, результатом будет значение 3, так как в строке "a.b.c.d" три точки.

Если у вас есть дополнительные вопросы по данному коду или нужна помощь с чем-то еще, не стесняйтесь спрашивать!

0

Ваше "идиоматическое однострочное" решение выглядит следующим образом:

int count = "a.b.c.d".length() - "a.b.c.d".replace(".", "").length();

Я не понимаю, почему решение с использованием StringUtils было принято.

Ваш подход довольно элегантен, так как он использует методы length() и replace(), чтобы легко подсчитать количество точек в строке. Это позволяет избежать дополнительной зависимости от сторонних библиотек, что делает код более чистым и понятным.

С другой стороны, решение с StringUtils может быть менее интуитивным и более громоздким, особенно если нет явной необходимости в его использовании.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь