Вот немного другое решение. Он использует EnumSet
для записи статуса пройденных тестов. В конце, если все 5 тестов пройдены, это действительный пароль. Существуют два теста на короткое замыкание, которые сразу же возвращают false.
- Один для проверки длины.
- И один, который обнаруживает плохой символ.
Это кажется на работу, но я, возможно, что-то упустил.
enum Category {
SPECIAL, UPPER, DIGIT, LOWER, LENGTH
}
String[] passwords = { "password", "$m0neyRoll",
"$moneyRoll+", "$01_Fo",
"password123", "Wh@taP@$$w0rD!" };
for (String pw : passwords) {
System.out.printf("%5s : %s%n", solution(pw), pw);
}
Печать
false : password
true : $m0neyRoll
false : $moneyRoll+
true : $01_Fo
false : password123
true : Wh@taP@$$w0rD!
public static boolean solution(String password) {
EnumSet<Category> reqmts = EnumSet.noneOf(Category.class);
if (password.length() < 6) {
return false;
}
reqmts.add(Category.LENGTH);
for (char c : password.toCharArray()) {
if (Character.isUpperCase(c)) {
reqmts.add(Category.UPPER);
} else if (Character.isLetter(c)) {
reqmts.add(Category.LOWER);
} else if ("!@#$%^&*()_".indexOf(c) >= 0) {
reqmts.add(Category.SPECIAL);
} else if (Character.isDigit(c)) {
reqmts.add(Category.DIGIT);
} else {
// must be a bad character.
return false;
}
}
// all conditions satisfied.
return reqmts.size() == Category.values().length;
}
Это не самый эффективный способ сделать это, но из-за их природы программного обеспечения для проверки пароля не обязательно должен быть эффективным.
- Даже при современных стандартах обработки пользователь не заметит медленной проверки пароля.
- А медленная проверка пароля полезна, чтобы избежать повторяющихся сценариев атаки ios. В некоторых случаях разработчики специально добавили задержки для аутентификации по паролю.