lots of exercises in java... from https://github.com/exercism/java

LuhnValidator.java 1.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.regex.Pattern;
  4. final class LuhnValidator {
  5. private static final Pattern SPACE_PATTERN = Pattern.compile("\\s+");
  6. boolean isValid(final String candidate) {
  7. final String sanitizedCandidate = SPACE_PATTERN.matcher(candidate).replaceAll("");
  8. if (sanitizedCandidate.length() <= 1) {
  9. return false;
  10. }
  11. // We need to alter every second digit counting from the right. Reversing makes this easy!
  12. final String reversedSanitizedCandidate = reverse(sanitizedCandidate);
  13. final List<Integer> computedDigits = new ArrayList<>();
  14. for (int charIndex = 0; charIndex < reversedSanitizedCandidate.length(); charIndex++) {
  15. int inputDigit = Character.digit(reversedSanitizedCandidate.charAt(charIndex), 10);
  16. /*
  17. * Character.digit returns a negative int if the supplied character does not represent a digit with respect
  18. * to the given radix.
  19. */
  20. if (inputDigit < 0) {
  21. return false;
  22. }
  23. if (charIndex % 2 == 1) {
  24. inputDigit = 2 * inputDigit;
  25. if (inputDigit > 9) {
  26. inputDigit -= 9;
  27. }
  28. }
  29. computedDigits.add(inputDigit);
  30. }
  31. final int digitSum = computedDigits.stream().mapToInt(Integer::intValue).sum();
  32. return digitSum % 10 == 0;
  33. }
  34. private String reverse(final String string) {
  35. return new StringBuilder(string).reverse().toString();
  36. }
  37. }