java - 用Java 8 Stream计算Luhn算法

标签 java algorithm java-8 java-stream

我正在尝试验证 IMEI借助 Java 8 中的 Stream API 进行编号。

private void ValidateIMEI() {
    field //a field holding an IMEI Number
            .getText().chars()
            .map(this::ConvertASCIIToNumer);
}

我卡住的部分是将偶数加倍并将其除以 10。

最初,我尝试了传统的 for 循环:

private void ValidateIMEI() {
    int[] numbers = field //a field holding an IMEI Number
            .getText().chars()
            .map(this::ConvertASCIIToNumer).toArray();

    int sum = 0;
    for (int i = 0; i < numbers.length; i++) {
        //Double the even number and divide it by 10. add quotient and remainder
        if ((numbers[i]+1) % 2 == 0) {
            numbers[i] = numbers[i] * 2;
            numbers[i] = numbers[i] / 10 + numbers[i] % 10;
        }
        sum += numbers[i];
    }

    if (sum%10==0) {
        status.setText("Valid");
    }
    else{
        status.setText("InValid");
    }        
}

但是代码被破坏了,最特别的是使用了我不想要的 For 循环。

因此,任何人都可以帮助实现 Luhn algorithm在 Java 8 中只有 Stream API?

ConvertASCIIToNumer 代码:

private int ConvertASCIIToNumer(int value) {
    return Character.digit(value, 10);
}

最佳答案

您的错误是,当您应该将具有偶数索引的数字加倍时,您却将偶数加倍。由于索引在此算法中很重要,我建议使用索引的 IntStream :

boolean isValid =
    IntStream.range(0,numbers.length)
             .map (i -> (((i%2) ^ (numbers.length%2)) == 0) ? ((2*numbers[i])/10+(2*numbers[i])%10) : numbers[i])
             .sum() % 10 == 0;

编辑:我只是改变了条件,因为数组的长度决定了奇数还是偶数索引应该乘以 2。

如果数组的长度是偶数,则偶数索引中的数字应加倍:

Index 0 1 2 3 4 5

Digit 1 5 2 5 2 6
      -   -   -

如果数组的长度是奇数,奇数索引中的数字应该是双倍:

Index 0 1 2 3 4

Digit 1 5 2 5 2
        -   -

关于java - 用Java 8 Stream计算Luhn算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33592167/

相关文章:

java - java.awt.Robot 和 java.awt.event.KeyEvent 支持鼠标键吗?

java - 如何从 MainActivity 添加到 network_security_config

Python - 阶乘之和

使用 lambda 的 List<> 的 Java8 子列表

java-8 - 如何使用 Java 7 或更早版本实现 Java 8 Stream API?

java - 使用 map 惯用地进入 Java 8 流?

java - 创建 Web 服务客户端时出现 NoSuchMethodError

java - ArrayList<String> 类型中的方法 add(String) 不适用于参数 (String[])

java - 使用几个 boolean 条件 java 改进代码

algorithm - 使用 BFS 进行图形着色 - 贪婪着色?