我目前正在研究一个字谜解算器。我看到一篇非常好的帖子,其中建议在比较之前按字母顺序排列用户输入和字典列表的字母。这看起来很有趣,所以我想尝试一下。以前我使用过排列,但我想要一些我最终可以(有效地)用来解决多词字谜的东西。
我可以将用户输入和字典放入字符数组中并按字母顺序排序。现在我需要比较每个,以便我可以确定某些东西是否是字谜。我考虑过按字母顺序排列的用户输入并确定按字母顺序排列的字典是否包含它。我在下面发布了我的代码。正如你所猜测的,我对这个过程的逻辑有点困惑。我想知道是否有人可以帮助我理顺一下逻辑。谢谢你的帮助。
public class AnagramSolver1 {
public static void main(String[] args) throws IOException {
List<String> dictionary = new ArrayList<String>();
List<String> inputList = new ArrayList<String>();
BufferedReader in = new BufferedReader(new FileReader("src/dictionary.txt"));
String line = null;
Scanner scan = new Scanner(System.in);
while (null!=(line=in.readLine())){
dictionary.add(line);
}
in.close();
char[] sortDictionary;
char[] inputSort;
System.out.println("Enter Word: ");
String input = scan.next();
inputList.add(input);
//Getting a little confused here. I thought about sorting my input
//then iterating through my dictionary (while sorting it too) and comparing
//thus far it produces nothing
for(int i = 0; i < inputList.size(); i++){
inputSort = inputList.get(i).toCharArray();
Arrays.sort(inputSort);
for (int j = 0; j < dictionary.size(); j++) {
sortDictionary = dictionary.get(i).toCharArray();
Arrays.sort(sortDictionary);
if(inputSort.equals(sortDictionary)){
System.out.println("Anagram" +dictionary.get(i));
} //end if
}//end for
}//end for
}//end main
}
最佳答案
为什么不维护 Map<String, Set<String>>
它将排序后的字符串映射到一组作为其字谜词的字符串。您可以在阅读字典中的单词时更新此 map 。例如,如果您读到单词 dog
您可以向 map "dgo" => {"dog"}
添加一个条目(请注意, dgo
由单词 dog
的排序字符组成)。那么如果你读到这个词god
,您可以对其字符进行排序以获得相同的 dgo
并将之前的条目修改为 "dgo" => {"dog", "god"}
。您当然会为字典中的每个单词重复此操作。
这应该可以实现快速、轻松的查询。如果你想找到这个词 dog
的字谜你会使用map.get(sortChars("dog"))
。
另一方面,我将重申其他答案提到的内容,即模块化代码很重要。您应该将逻辑上相关的函数/任务放在它们自己的方法中,而不是将所有内容都放在一处。这有助于提高可读性以及您/其他人将来维护代码的能力。
关于java - 比较两个列表的字谜 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17095745/