Комментарии к вашему коду:
Соглашение об именах Java для имен методов должно начинаться со строчной буквы, как ваш isValid
метод.
В методе doubleToSingle
x
- это int
, а 10
- это int
литерал, поэтому x / 10
будет int
, а результат будет усечен, что означает, что нетнеобходимо для этого приведения: (int)(x / 10)
Поскольку метод doubleToSingle
может обрабатывать однозначные числа, нет необходимости в том, чтобы вызывающий (метод doubling
) обрабатывал его,поэтому исключите тест if (parse > 9)
.
Подсчет цифр справа работает следующим образом:
5th digit Odd places:
↓ 3rd digit Don't double these digits, just sum them
↓ ↓ 1st digit
↓ ↓ ↓
999999
↑ ↑ ↑
↑ ↑ 2nd digit Even places, aka "every second digit from right":
↑ 4th digit Double these digits, combine digits when
6th digit two-digit number, then sum them
Запускается метод doubling
при индексе last , а не за вторым-последним, как следует, и он пропускает индекс first , чего не должно быть. Цикл должен быть:
for (int index = s.length() - 2; index >= 0; index -= 2)
Метод doubling
должен действительно удвоить число (parse * 2
) перед вызовом метода doubleToSingle
.
Метод oddDigits
считает нечетное / четное от влево , когда он должен считаться от вправо .
Удалите тест if (index % 2 != 0)
и используйте цикл, аналогичный используемому в методе doubling
:
for (int index = s.length() - 1; index >= 0; index -= 2)
Методы doubling
и oddDigits
должны return
sum
, иначе какой смысл?
Если вы думаете, что отсутствие возврата из методов doubling
и oddDigits
застало вас, поэтому я позволю вампродолжайте работу над остальной частью своего кода.
Хотя следующий код выходит за рамки вашего текущего уровня навыков, я хочу показать его, чтобы у вас было что-то, на что можно рассчитывать, уметь понимать и в конечном итогенапишите код наподобие этого.
public static boolean isValid(String cc) {
if (! cc.matches("(?=[456]|37)[0-9]{13,16}"))
return false;
int sum = 0;
for (int i = cc.length() - 1, pos = 1; i >= 0; i--, pos++) {
int digit = cc.charAt(i) - '0';
sum += (pos % 2 == 1/*odd*/ ? digit : digit < 5 ? digit * 2 : digit * 2 - 9);
}
return (sum % 10 == 0);
}
Он проверяет все условия, перечисленные в вопросе, даже часть "Это должно начинаться с", которую вы не запустилибуду еще. На вашем уровне навыка вам, вероятно, следует использовать s.startsWith("xx")
вместо регулярного выражения matches(...)
, используемого здесь.