2

我目前正在研究字谜求解器。我看到一篇非常好的帖子,其中有一个建议是在比较之前按字母顺序排列用户输入和字典列表的字母。这似乎很有趣,所以我正在尝试一下。以前我使用排列,但我想要一些我最终可以(并且有效地)用来解决多词字谜的东西。

我可以将我的用户输入和字典放入 char 数组并按字母顺序排序。现在我需要比较每一个,这样我就可以确定某个东西是否是字谜。我考虑采用按字母顺序排列的用户输入并确定按字母顺序排列的字典是否包含它。我已经在下面发布了我的代码。你可以猜到我对这个过程的逻辑有点困惑。我想知道是否有人可以帮助我理顺一下逻辑。谢谢你的帮助。

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
}
4

2 回答 2

2

为什么不维护一个Map<String, Set<String>>将排序字符串映射到一组作为其变位词的字符串。您可以在从字典中读取单词时更新此地图。例如,如果您阅读单词dog,您将在地图中添加一个条目"dgo" => {"dog"}(注意dgo由单词的排序字符组成dog)。然后,如果您阅读该单词god,您将对它的字符进行排序以获得相同的dgo结果,从而将先前的条目修改为"dgo" => {"dog", "god"}. 您当然会为字典中的每个单词重复此操作。

这应该允许快速和简单的查询。如果你想然后找到dog你会使用的单词的字谜map.get(sortChars("dog"))

另一方面,我将重申另一个答案提到的内容,即模块化代码很重要。您应该将逻辑相关的功能/任务放在他们自己的方法中,而不是把所有东西都放在一个地方。这有助于提高可读性和您/其他人将来维护您的代码的能力。

于 2013-06-13T20:01:31.713 回答
1

你在这里一次做的事情太多了。您将文件 IO、用户输入、排序和算法集中在一处。尝试对其进行模块化,以便您拥有一个名为isAnagram(List<Character> firstPhrase, List<Character> secondPhrase). 确保它正常工作,然后让所有其他步骤弄清楚如何调用它。这样您就可以在不需要用户输入的情况下测试您的算法。这将是一个更快的反馈循环。

它的算法将像这样工作:

  1. (可选)复制输入的内容,这样你就不会改变输入
  2. 比较它们的长度。如果它们不相等,则返回 false
  3. 对每个列表进行排序
  4. 逐个元素迭代并检查它们是否相等。如果不是,则返回 false
  5. 如果到达终点,则返回 true。
于 2013-06-13T19:54:15.330 回答