Я пытаюсь написать метод, который будет проверять строку. Если строка имеет одинаковое количество каждого символа, например "aabb"
, "abcabc"
, "abc"
, она действительна или содержит один дополнительный символ, такой как "ababa"
или "aab"
, также допустима и в других случаях - недействительно. Обновление: извините, я забыл упомянуть такие случаи, как abcabcab -> a-3, b-3, c -2 -> 2 дополнительных символа (a, b) -> недопустимые. И мой код не охватывает такие случаи. Пробел - это символ, заглавные буквы отличаются от строчных. Теперь у меня есть это, но это выглядит неоднозначно (особенно последние два метода):
public boolean validate(String line) {
List<Long> keys = countMatches(countChars(line));
int matchNum = keys.size();
if (matchNum < 2) return true;
return matchNum == 2 && Math.abs(keys.get(0) - keys.get(1)) == 1;
}
Подсчет ввода уникальных символов, я бы sh, чтобы получить List<long>
, но я не знаю, как:
private Map<Character, Long> countChars(String line) {
return line.chars()
.mapToObj(c -> (char) c)
.collect(groupingBy(Function.identity(), HashMap::new, counting()));
}
private List<Long> countMatches(Map<Character, Long> countedEntries) {
return new ArrayList<>(countedEntries.values()
.stream()
.collect(groupingBy(Function.identity(), HashMap::new, counting()))
.keySet());
}
Как я могу оптимизировать метод выше? Мне нужно просто List<Long>
, но мне нужно создать карту.