Я думаю, что переменная numberDups
в вашем примере кода неверно названа, и это смущает некоторых людей. Эта переменная должна представлять количество различных символов, не так ли? То есть, если строка abcabc
, число будет 3
, а для строки aaaaaaaaa
это будет 1
.
В таком случае самое простое решение, как уже говорили другие, использовать Набор. На самом деле ваш код почти там; просто избавьтесь от счетчика numberDups
и замените его на HashSet<Character>
, например:
static boolean isFormatValid(String password) {
CharSequence inputStr = password;
int length = inputStr.length();
Set<Character> uniqueChars = new HashSet<Character>();
for(int i=0; i < length; ++i) {
uniqueChars.add(inputStr.charAt(i));
}
return uniqueChars.size() >= 3;
}
(Однако вам не нужно создавать переменную inputStr
. Вы можете вызывать методы CharSequence, такие как charAt()
и length()
для переменной password
, поскольку String
реализует интерфейс CharSequence
.)
РЕДАКТИРОВАТЬ: Я также хочу отметить, что, как вы использовали Pattern и Matcher, вы не использовали их. Вы правильно создали Matcher из Pattern и связали его с входной строкой, но затем он просто сидел там. Чтобы применить регулярное выражение, вы должны вызвать один из методов, find()
или matches()
(или lookingAt()
, но никто никогда не использует его).
Это очень распространенная ошибка новичка. Java имеет репутацию чрезмерно многословного в любом случае, но это особенно заметно (и удивительно) в этом случае. Я имею в виду, для чего нужны регулярные выражения, если не позволить вам решить проблемы без написания пакетов кода? Но это не всегда так плохо; Вот решение с одной строкой, использующее регулярное выражение:
return inputStr.replaceAll("(.)(?=.*\\1)", "").length() >= 3;
То есть удалите все дубликаты, и длина полученной строки будет равна количеству уникальных символов. Решение на основе множеств все же проще; этот просто короче.