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