Developer87:
フレーズ内の各センテンスのための単語の最大数を見つける必要があります。文は、によって分割されている?.!
シンボル。
私はほとんどこの作業を行ってきたが、私は純粋なJava 8の方法でそれを行うにはこだわっている、あなたは私を助けてくださいだろうか?
public static void main(String[] args) {
assert solution("We test coders. Give us a try?") == 4;
assert solution("Forget CVs..Save time . x x") == 2;
assert solution("Some some! time . x x") == 2;
}
public static int solution(String S) {
return Arrays.stream(S.split("[.!?]"))
.map(String::trim)
.filter(s -> !s.isEmpty())
.max(Comparator.comparingInt(o -> o.split(" ").length))
.map(s -> s.split(" "))
.flatMap(...); // <-- what to do here?
}
ETO:
ただによって単語を分割する"\\s+"
(これは、複数の空白文字を無視します)。そして、取得max()
から値をIntStream
。
Arrays.stream(str.split("[.!?]"))
.map(String::trim)
.filter(s -> !s.isEmpty())
.mapToInt(s -> s.split("\\s+").length)
.max()
.orElse(0);
@Holgerによって提案されたような答えを更新しました:
Arrays.stream(str.split("\\s*+(?:[.!?]\\s*+)+"))
.mapToInt(s -> s.split("\\s+").length)
.max()
.orElse(0);
そして、もう一つの機能的なスタイルのアプローチ(ちょうど楽しみのために)。私はあなたがここにかかわらず、それを必要と疑う:)
Stream.of(str)
.map(splittingBy("\\s*+(?:[.!?]\\s*+)+"))
.flatMap(Arrays::stream)
.map(splittingBy("\\s+"))
.mapToInt(arr -> arr.length)
.max()
.orElse(0);
...
static Function<String, String[]> splittingBy(String regex) {
return str -> str.split(regex);
}