Java 8 Stream, получить длину строки из-за нескольких условий - PullRequest
1 голос
/ 09 марта 2019

У меня есть программа, которая вычисляет вхождения d, например, s = "dda" и n = 10 Я буду повторять их, пока не получу s.length = 10 например, ddaddaddad result = 7d.

Я сделал это в цикле основы:

int count = 0;
String s = "dda";
int n = 10;
for (int i = 0; i < s.length(); i++) {
     if (s.charAt(i) == 'd')
         count++;
}

for (int i = 0; i < n % s.length(); i++) {
     if (s.charAt(i) == 'd')
         count++;
}
return count * (n / s.length());

Таким образом, я пытаюсь сделать это с помощью потоков, и мне интересно, как я могу это сделать?

Чего я уже достиг:

return s.chars().filter(x -> x == 'd').count() * (n / s.length()) + (n % s.length());

Я знаю, проблема в этой последней части (n % s.length()) Мне нужно проверить, содержит ли индекс d или нет, но я не знаю, как это сделать.

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

все, что вам нужно добавить в свой расчет - это подстроку s с напоминанием и повторить счет: -

    return s.chars().filter(x -> x == 'd').count() * (n / s.length()) +
            s.substring(0, n % s.length()).chars().filter(x -> x == 'd').count();

РЕДАКТИРОВАТЬ : если по какой-то причине вам не нравитсяoldfashined подстроку, вы могли бы заменить ее потоком целых чисел от 0 до напоминания:

    return s.chars().filter(x -> x == 'd').count() * (n / s.length()) +
            IntStream.range(0, n % s.length()).filter(i -> s.charAt(i)== 'd').count();

Однако, вопрос напоминает, является ли эта версия для всех потоков более всеобъемлющей / читаемой.

0 голосов
/ 09 марта 2019

Возможно, вы просто ищете более простую логику, если я правильно понял ваш вопрос.Это может быть как:

private int characterCountWithRecurrenceWithinLimit(String string, int limit, char c) {
    // repeat string unless its shorter than the limit

    StringBuilder sBuilder = new StringBuilder(string);
    while (sBuilder.length() < limit) {
        sBuilder.append(string);
    }
    // keep the string within the limit
    String repeatedString = sBuilder.toString().substring(0, limit);
    // count the character occurrence
    return (int) IntStream.range(0, repeatedString.length())
            .filter(i -> repeatedString.charAt(i) == c)
            .count();
}
...