在java中,第一个数组值乘以1,第二个数组值乘以3

在java中,第一个数组值乘以1,第二个数组值乘以3,java,arrays,Java,Arrays,第一次发帖,不便之处,敬请谅解 所以我正在做一个ISBN检查程序,但我一直在解决这个问题。我想把数组的第一个值乘以1,然后把第二个值乘以3,然后再乘以1,再乘以3,依此类推。以下是我目前的代码: String num = "9783453146976"; //split the string and save to a string array String[] splitNum = num.split(&qu

第一次发帖,不便之处,敬请谅解

所以我正在做一个ISBN检查程序,但我一直在解决这个问题。我想把数组的第一个值乘以1,然后把第二个值乘以3,然后再乘以1,再乘以3,依此类推。以下是我目前的代码:

        String num = "9783453146976";
        
        //split the string and save to a string array
        String[] splitNum = num.split("");
        
        //create an int array to save the splitten strings after conversion
        int[] intsNum = new int[num.length()];
        
        
        for (int i = 0; i <= (num.length() - 2); i++)
        {
            intsNum[i] = Integer.parseInt(splitNum[i]);
            
            System.out.print(intsNum[i]);
        }
String num=“9783453146976”;
//拆分字符串并保存到字符串数组
字符串[]splitNum=num.split(“”);
//创建一个int数组以在转换后保存拆分字符串
int[]intsNum=新int[num.length()];

对于(int i=0;i,正如我在评论中所说,您在这里缺少的是:

  • 一个条件乘法,基于数字的索引,假设我们从0(偶数索引)开始,我们应该应用1的乘法,然后到1(奇数索引)我们应用3的乘法,依此类推……这可以通过简单地检查索引%2是否返回
    0
    (偶数)来实现或
    1
    (奇数)

  • 您需要将所有这些值相加,然后将其转换为控制数字,即,如果总和%10等于
    0
    ,则控制数字为0,否则为10-总和%10

  • 如果我必须扩展您提供的代码,它将如下所示:

    private static boolean checkISBN(String isbn) {
    
        if (isbn == null || !isbn.matches("\\d{13}")) {
            return false;
        }
    
        String[] splitNum = isbn.split("");
    
        int sum = 0;
    
        for (int i = 0; i <= (isbn.length() - 2); i++)
        {
            sum += Integer.parseInt(splitNum[i]) * (i % 2 == 0 ? 1 : 3);
        }
    
        return Integer.parseInt(splitNum[splitNum.length - 1]) == (sum % 10 == 0 ? 0 : 10 - sum % 10);
    }
    
    private static boolean checkISBN(String isbn) {
    
        if (isbn == null || !isbn.matches("\\d{13}")) { // validat that the input contains of exactly 13 digits
            return false;
        }
    
        // parse the digits as integers
        int[] digits = Arrays.stream(isbn.split(""))
                             .mapToInt(s -> s.charAt(0) - '0')
                             .toArray();
    
        // calcuate the control digit
        int controlDigit = IntStream.range(0, digits.length - 1)
                                    .mapToObj(i -> digits[i] * (i % 2 == 0 ? 1 : 3))
                                    .reduce(Integer::sum)
                                    .map(sum -> sum % 10 == 0 ? 0 :  10 - sum % 10)
                                    .orElse(-1);
    
        // validate the control digit
        return digits[digits.length - 1] == controlDigit;
    }
    

    我猜您缺少最后一个元素,或者应用于给定的输入,最后一个数字被剪切-
    6
    (num.length()-2)
    是有问题的部分-通常您应该执行
    I
    从零开始,即
    int i=0
    。最后的6是前面数字的校验和。你将第一个数字乘以1,第二个数字乘以3,依此类推。然后你将它们相加,然后用下一个乘法10减去和,得到6。哦,我明白了。然后你缺少一个翻转乘法器和一个存储变量,即
    int mult=i%2==0?1:3;
    ,然后
    store(+=|*=)mult*intsNum[i];
    ,一旦完成循环,你就可以转换存储并得到答案。我希望这有帮助。谢谢,第一次看到这个。我会尝试一下,看看是否成功:)非常感谢它的工作。你给我的想法是,如果i%2==0;那么intsNum[i]*=1;else intsNum[i]*=3;它成功了。非常感谢:D