比较Anagrams的两个列表 - Java

时间:2013-06-13 19:48:37

标签: java list char anagram

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

我可以将用户输入和字典放入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
}

2 个答案:

答案 0 :(得分:2)

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

这应该允许快速和轻松的查询。如果您想查找单词dog的字谜,可以使用map.get(sortChars("dog"))

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

答案 1 :(得分:1)

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

它的算法将如下工作:

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