我有一个单词的ArrayList,我想将这些单词相互比较,将它们存储在HashTable中(以字谜为一组)。
我知道如何比较两个字来测试它们是否是一个字谜,但我无法弄清楚如何比较更长的单词列表。
例如:
如何比较10个单词以找到那些5 + 2个字谜,并将这些字谜组(单独)存储到哈希表中?
修改
我用来比较两个单词的代码:
public static boolean isAnagram(String firstWord, String secondWord) {
boolean anagram;
if (firstWord.length() != secondWord.length()) {
return false;
}
firstWord = firstWord.toLowerCase();
secondWord=secondWord.toLowerCase();
char[] c1 = firstWord.toCharArray();
char[] c2 = secondWord.toCharArray();
Arrays.sort(c1);
Arrays.sort(c2);
String sc1 = new String(c1);
String sc2 = new String(c2);
if (sc1.equals(sc2)) {
System.out.println("ANAGRAMS");
} else {
System.out.println("NOT ANAGRAMS");
}
return sc1.equals(sc2);
}
我确信这可以适应比较无限数量的字符串。然后,下一个困境是确保将不同的字谜组存储在哈希表中。
答案 0 :(得分:2)
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class AnagramDetector {
public static void main(String[] args) {
List<String> words = new ArrayList<>();
words.add("Abc");
words.add("cba");
words.add("bca");
words.add("bc");
words.add("ba");
words.add("ab");
MultiValueMap<String, String> res = new LinkedMultiValueMap<>();
words.stream().forEach(word -> {
String key = getAnagramKey(word);
res.add(key, word);
});
System.out.println(res);
}
public static String getAnagramKey(String word) {
char[] c = word.toLowerCase().toCharArray();
Arrays.sort(c);
return new String(c);
}
}
Hashtable的更新:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
public class AnagramDetector {
public static void main(String[] args) {
List<String> words = new ArrayList<>();
words.add("Abc");
words.add("cba");
words.add("bca");
words.add("bc");
words.add("ba");
words.add("ab");
Hashtable<String, List<String>> res = new Hashtable<>();
words.stream().forEach(word -> {
String key = getAnagramKey(word);
List<String> anWords = res.get(key);
if (anWords == null) {
anWords = new ArrayList<>();
res.put(key, anWords);
}
anWords.add(word);
});
System.out.println(res);
}
public static String getAnagramKey(String word) {
char[] c = word.toLowerCase().toCharArray();
Arrays.sort(c);
return new String(c);
}
}
答案 1 :(得分:1)
我看到你已经发现你可以对字符串进行排序,以确定两个字符串是否为字谜。
当键是排序字符串时,您可以将每个字符串存储在哈希表中。例如,字符串“CBA”将保存在点“ABC”中,然后很容易检查字符串的字谜是否已经出现。
如果您确实需要字符串本身,那么您可以将它们存储在列表列表中,或者更好的方法是使用Multimap。