1

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

}

}
4

3 回答 3

1

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

尝试这个:

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

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

  1. 将 List 存储为值,并在阅读字典时将其添加到其中。
  2. 使用 MultiMap(谷歌有一些可用的;我认为该项目是番石榴)。
于 2013-06-20T20:48:23.180 回答
1

这里有个大bug:

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

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

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

要将 achar[]变成 a String,请执行以下操作:

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

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

于 2013-06-20T20:54:48.460 回答
0

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

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

选项 2)不是比较 char[] 而是使用字符串的 equals() 方法将其与比较字符串的点进行比较,该方法也将比较内容。

于 2013-06-20T20:53:33.500 回答