Первый раз размещения, поэтому заранее извиняюсь за неудобства.

Итак, я делаю программу проверки 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]);
        }
0
skidzophrenic 29 Ноя 2020 в 00:16

1 ответ

Лучший ответ

Как я уже сказал в комментариях, вам здесь не хватает:

  1. Условное умножение, основанное на индексе цифры, при условии, что мы начинаем с 0 (четный индекс), мы должны применить умножение на 1 , а затем перейти к индексу 1 (нечетный индекс), мы применяем умножение на 3 и так далее ... Этого можно достичь, просто проверив, возвращает ли индекс % 2 { {X0}} (четный) или 1 (нечетный).

  2. Вам нужно будет просуммировать все эти значения, а затем преобразовать это в контрольную цифру , т.е. если сумма % 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);
}

Другой способ - использовать Stream API . Базовая реализация, следующая за этим руководством, выглядит так:

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;
}
1
dbl 28 Ноя 2020 в 23:25