Сначала вам нужно переместить вызов toLowerCase()
.
input = input.replaceAll("[^äÄöÖüÜßa-zA-Z ]", ""); // <== Removed from here
String[] sentence = input.split(" ");
Map<String, Set<String>> anagrams = new HashMap<>();
for(int i = 0; i < sentence.length; i++){
char[] charwords = sentence[i].toLowerCase().toCharArray(); // <== Added here
Arrays.sort(charwords);
String key = new String(charwords);
Set<String> anagramSet = anagrams.get(key);
if (anagramSet == null) {
anagramSet = new HashSet<>();
anagrams.put(key, anagramSet);
}
anagramSet.add(sentence[i]);
}
Затем вам нужно удалить записи из карты anagrams
, которые не содержат реальных анаграмм.
Этот шаг полностью отсутствует в коде вопроса, где записи карты с Set
размером 1 не являются действительными анаграммами.
Теперь, когда Set
содержит слова с их исходным регистром, не-анаграммы, такие как"The"
и "the"
могут присутствовать и также должны быть устранены, при условии, что анаграмм real нет. Если имеются реальные анаграммы, следует сохранить различные варианты корпусов.
Чтобы проверить это, добавьте все слова в набор в нижнем регистре и исключите, если этот новый набор имеет размер 1,в противном случае сохраните сохраняющий регистр набор.
// code from above here
for (Iterator<Set<String>> iter = anagrams.values().iterator(); iter.hasNext(); ) {
Set<String> words = iter.next();
if (words.size() == 1) {
iter.remove(); // Not anagram: Single spelling only
} else {
Set<String> lower = new HashSet<>();
for (String word : words)
lower.add(word.toLowerCase());
if (lower.size() == 1) {
iter.remove(); // Not anagram: Multiple case variants, but all same spelling
}
}
}
Test
Input: This is a test of 'the' and 'The'
Result: {}
Input: This is a test of 'the', 'The', and 'eth'
Result: {eht=[the, The, eth]}
Если вы не хотите сохранять все варианты регистрато же слово, а затем просто сделать набор без учета регистра , используя new TreeSet<>(String.CASE_INSENSITIVE_ORDER)
.
(сжатый код, некоторые из них с использованием функций Java 8)
Map<String, Set<String>> anagrams = new HashMap<>();
for (String word : input.replaceAll("[^äÄöÖüÜßa-zA-Z ]", "").split(" ")) {
char[] letters = word.toLowerCase().toCharArray();
Arrays.sort(letters);
String key = new String(letters);
anagrams.computeIfAbsent(key, k -> new TreeSet<>(String.CASE_INSENSITIVE_ORDER))
.add(word);
}
anagrams.values().removeIf(words -> words.size() == 1);
Тест
Input: This is a test of 'the' and 'The'
Result: {}
Input: This is a test of 'the', 'The', and 'eth'
Result: {eht=[eth, the]}
Input: This is a test of 'The', 'the', and 'eth'
Result: {eht=[eth, The]}