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

标签 java algorithm lambda java-8 java-stream

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

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

例如

12300 % 10 == 0 true

1230%10==0true

123 % 10 == 0

答案:2

注意:我不想在这里涉及字符串:-)

最佳答案

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

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();

}

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

// 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/

相关文章:

java - 使用网络代理时 Hibernate 插入两次

java - 运行 Android 应用程序时 Eclipse ADT 卡住

java - 自定义 PMD 规则集不起作用

algorithm - 如何生成所有具有n个节点和m级深度的树?分支因子是可变的,在树本身内不必恒定

c# - 为通用 C# 集合中的每个值调用一个函数

java - 从类路径设置嵌入式 Jetty war

计算最有效分组的算法

java - ATM限额钞票给钱算法

c++ - 可以接受未知签名的可变函数引用的类

c# - 将 Expression<Func<T, TProperty>> 转换为 Expression<Func<object, object>>,反之亦然