关于字谜的几个问题

Posted

技术标签:

【中文标题】关于字谜的几个问题【英文标题】:A couple questions regarding anagrams 【发布时间】:2013-06-17 21:05:56 【问题描述】:

这是我已经问过的几个问题的后续。之前我问过如何使用一种方法来确定一个列表的元素是否存在于另一个列表中。我这样做的原因是因为我想确定一个列表是否包含另一个列表的字谜 - 使用用户输入和字典列表。我很难确定这一点。我想将列表传递给一个方法来确定一个是否包含另一个的元素。现在,只有当我知道存在真正的字谜时,它才会返回 false。

有人可以看看我的代码并帮我弄清楚吗?另外,我将如何修改它以确定用户输入是否包含多字字谜?

我的算法通过获取两个列表并按字母顺序排列每个单词中的字母来工作。我在另一篇文章中读到了这种方法,并决定采用它——它仍在进行中。这是我的代码:

public class AnagramSolver1 

public static void main(String[] args) throws IOException 

    //Scanner/Reader
    Scanner scan = new Scanner(System.in);
    BufferedReader in = new BufferedReader(new FileReader("src/dictionary.txt"));

    //Lists to contain unsorted dictionary and input and after alphabetical sort
    List<String> dictionary = new ArrayList<String>();
    List<char[]> dictionarySort = new ArrayList<char[]>();
    List<String> inputList = new ArrayList<String>();
    List<char[]> inputSort = new ArrayList<char[]>();

    String line = null;

    //read in dictionary then sort alphabetically////
    while (null!=(line=in.readLine()))
    
       dictionary.add(line);
    
    in.close();

    dictionarySort = sortList(dictionary);

    //print statement
    /*
    for(int i = 0; i < dictionarySort.size(); i++)
        System.out.println(dictionarySort.get(i));
    */

    //User input, scan in then sort alphabetically////
    System.out.println("Enter Word: ");

    String input = scan.next();

    inputList.add(input);

    inputSort = sortList(inputList);

    //print statement
    /*
    for(int i = 0; i < inputSort.size(); i++)
        System.out.println(inputSort.get(i));
    */

    //determine if user input is an angram of any dictionary word
    boolean isAnagram = isAnagram(dictionarySort, inputSort); 
    System.out.println(isAnagram);



//sort a string into a char array
public static List<char[]> sortList (List<String>sort)

    List<char[]> sortList = new ArrayList<char[]>();
    char[] letterSort;

      for (int i = 0; i < sort.size(); i++) 
          letterSort = sort.get(i).toCharArray();
          Arrays.sort(letterSort);
          sortList.add(letterSort);
      

    return sortList;    

//Determines if User input is an Anagram or not.
public static boolean isAnagram (List<char[]>dictionarySort, List<char[]>inputSort)

    for (char[] c : dictionarySort) 
            if (inputSort.contains(c)) 
                return true;
            
        
        return false;




【问题讨论】:

【参考方案1】:

这里有一个大错误:

for (char[] c : dictionarySort) 
    if (inputSort.contains(c))  // BUG!

这不会像你想象的那样工作。这将测试列表中是否包含完全相同的char[] 对象;它测试是否存在具有相同字符的char数组。

要按照您想要的方式工作,不要存储char[],存储Strings

要将char[] 转换为String,请执行以下操作:

char[] c;
String s = new String(s);

在数组中对字符进行排序后,将字符数组转换为字符串并将其存储在列表中。这意味着所有列表都应该是List&lt;String&gt;的列表。

【讨论】:

好的。那么我该如何解决呢? 谢谢,那么如何将列表 转换为列表?看起来你有点解释,但可以给我更多细节吗? 等一下。我想我只是回答了我自己的问题。我已经从 String 转换为 Char...我想只是反过来吧? 你转换为char[],所以你可以对字符进行排序,这很好,现在按照我的 sn-p 转换回来,并将新字符串添加到你的“排序”列表中【参考方案2】:

如果要确定一个单词是否是另一个单词的字谜,请对两个单词的字母进行排序,如果单词是字谜,则结果字符串必须相等。

试试这个:

加载字典时,对每个单词的字母进行排序。存储排序值以及字典值。考虑将字典单词存储在使用排序值作为键并以多个单词作为值的哈希映射中。 对用户输入的字母进行排序。 使用排序后的用户输入搜索字典(可能是地图)。 在显示字典中的字谜时,请务必从字谜列表中删除用户输入(blam 不是 blam 的字谜)。

有两种方法(我知道)将多个值放入 HashMap。

    将列表存储为值,并在您阅读字典时添加到其中。 使用 MultiMap(谷歌有一些可用的;我认为该项目是番石榴)。

【讨论】:

感谢您的回复。我以前尝试过分类到 Hashmaps 中。我遇到的问题是许多排序的单词会重复,而 Hashmap 不能有重复的键。我按字母顺序排列的目的是产生重复项,这就是我识别字谜的方式。你对如何克服这个障碍有什么建议吗? @dave 制作一个 HashMap,同时将键作为原始单词,将值作为排序后的单词。例如:K:浣熊,V:accnoor【参考方案3】:

您的问题是 list 接口中的 contains 实现了 equals(),在数组的情况下,要比较的是两个 char[] 的内存地址。你需要做的是:

选项 1) 让您的程序使用 Arrays.equals(char[] one, char[] two) 将字典中的元素与输入进行比较,这将比较内容。

选项 2) 不是比较 char[],而是使用字符串的 equals() 方法来比较字符串,而不是比较字符串。

【讨论】:

以上是关于关于字谜的几个问题的主要内容,如果未能解决你的问题,请参考以下文章

Python 3:关于字谜的大学作业非常困难(至少对我而言)

确定某物是不是是字谜的功能问题[关闭]

为所有字谜生成相同的唯一哈希码

比较字谜字符串时输出错误

制作两个字符串字谜

字符串数组只包含字谜?