关于字谜的几个问题

时间:2013-06-20 20:34:00

标签: java list anagram

这是我已经问过的几个问题的后续问题。之前我问过如何使用一种方法来确定一个列表中的元素是否存在于另一个列表中。我这样做的原因是因为我想确定一个列表是否包含另一个列表的字谜 - 使用用户输入和字典列表。我在确定这个问题时遇到了麻烦。我想将列表传递给一个方法,以确定是否包含另一个的元素。现在,当我知道存在真正的字谜时,它只会返回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;

}

}

3 个答案:

答案 0 :(得分:1)

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

试试这个:

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

有两种方法(我知道)可以在HashMap中放置多个值。

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

答案 1 :(得分:1)

这里有一个重大错误:

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

这不会像您认为的那样有效。这将测试列表中是否包含完全相同的char[]对象;如果存在具有相同字符的char数组,它 not 测试。

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

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

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

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

的列表

答案 2 :(得分:0)

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

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

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