gpt4 book ai didi

java - 如何使用 Java 8 Stream/Lambda 计算整数中尾随零的数量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:32:32 25 4
gpt4 key购买 nike

如何使用 Java 8 Stream/Lambda 计算整数中尾随零的数量?

基本上逻辑应该是:保持整数除以10,只要余数为0(商将提供给下一个除法)并计算发生。

例如

12300 % 10 == 0 true

1230 % 10 == 0 true

123 % 10 == 0 错误

答案:2

注意:我不想在这里涉及 String :-)

最佳答案

如果这是一个纯粹假设的问题,这里是一个关于如何做到这一点的纯粹假设的答案:

static int countZeroes(int value) {
if(value == 0) // we need to handle this case explicitly
return 1;
IntStream s = IntStream.iterate(value, v -> v / 10);
return (int) takeWhile(s, v -> v > 0 && v % 10 == 0)
.count();

}

它使用了一个在 Java 9 中可用但在 Java 8 中不可用的辅助函数 takeWhile,因此必须像这样模拟:

// In Java 9 there is a standard takeWhile
// https://docs.oracle.com/javase/9/docs/api/java/util/stream/Stream.html#takeWhile-java.util.function.Predicate-
// but in Java 8 I have to emulate it
static IntStream takeWhile(IntStream s, final IntPredicate pr) {
final Spliterator.OfInt origSp = s.spliterator();

Spliterator.OfInt filtered = new Spliterators.AbstractIntSpliterator(origSp.estimateSize(), 0) {
boolean lastPredicate = true;

@Override
public boolean tryAdvance(final IntConsumer action) {
if (!lastPredicate)
return false;

origSp.tryAdvance((int v) -> {
lastPredicate = pr.test(v);
if (lastPredicate) {
action.accept(v);
}
});
return lastPredicate;
}
};

return StreamSupport.intStream(filtered, false);
}

思路是

IntStream.iterate(value, v1 -> v1 / 10).takeWhile(v -> v > 0)

应该在末尾一个一个地生成一个切割数字流,然后你可以应用 takeWhile(v -> v % 10 == 0).count() 来计算零的数量最后,您可以将这两个 takeWhile 合并为一个。

关于java - 如何使用 Java 8 Stream/Lambda 计算整数中尾随零的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54426602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com