比较两个 Anagrams 列表 - Java

Posted

技术标签:

【中文标题】比较两个 Anagrams 列表 - Java【英文标题】:Compare two Lists for Anagrams - Java 【发布时间】:2013-06-10 08:25:07 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢,但我有一个问题。这对字典有什么作用? @dave 您可以通过我描述的过程预先加载整个字典。 好的。谢谢。让我再考虑一下。 如果您不想每次都进行转换,您可以编写一些在字典中读取的代码,请进行此转换,然后将地图写出来以便下次加载。 【参考方案2】:

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

它的算法是这样工作的:

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

【讨论】:

听起来是个好建议,让我再考虑一下。

以上是关于比较两个 Anagrams 列表 - Java的主要内容,如果未能解决你的问题,请参考以下文章

java 比较 两列表

查看两个字符串是不是为 Anagrams [C++]

Java比较两个列表

比较java中的两个列表对象

从字典文件中读取的 Java Anagrams

相互检查字符串(Anagrams)