gpt4 book ai didi

java - 用Java 8 Stream计算Luhn算法

转载 作者:搜寻专家 更新时间:2023-11-01 02:40:51 24 4
gpt4 key购买 nike

我正在尝试验证 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/

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