Java 关于字谜的几个问题
这是我已经问过的几个问题的后续问题。之前我问过如何使用一种方法来确定一个列表中的元素是否存在于另一个列表中。我这样做的原因是因为我想确定一个列表是否包含另一个的字谜-使用用户输入和字典列表。我很难确定这一点。我想将列表传递到一个方法中,以确定其中一个是否包含另一个的元素。现在,只有当我知道有一个真正的字谜出现时,它才会返回false 有人能看看我的代码,帮我弄明白吗?另外,我将如何修改它以确定用户输入是否包含多单词的字谜 我的算法是将两个列表和每个单词中的字母按字母顺序排列。我在另一篇文章中读到了这个方法,并决定采用它——它仍然是一项正在进行的工作。这是我的密码:Java 关于字谜的几个问题,java,list,anagram,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;
}
}
公共类AnagramSolver1{
公共静态void main(字符串[]args)引发IOException{
//扫描仪/读取器
扫描仪扫描=新扫描仪(System.in);
BufferedReader in=new BufferedReader(new FileReader(“src/dictionary.txt”);
//包含未排序字典和输入的列表,以及按字母顺序排序后的列表
列表字典=新的ArrayList();
List dictionarySort=new ArrayList();
List inputList=新建ArrayList();
List inputSort=new ArrayList();
字符串行=null;
//读字典,然后按字母顺序排序////
while(null!=(line=in.readLine())
{
添加(行);
}
in.close();
dictionarySort=sortList(字典);
//打印报表
/*
对于(int i=0;i
如果要确定一个单词是否是另一个单词的拼音,请对两个单词的字母进行排序,如果单词是拼音,则结果字符串必须相等
试试这个:
- 加载词典时,对每个单词的字母进行排序。存储排序值和字典值。考虑将字典单词存储在散列图中,该散列图使用排序值作为关键字,并将多个单词作为值。
- 对用户输入的字母进行排序
- 使用排序后的用户输入搜索字典(可能是地图)
- 从字典中显示字谜时,请确保从字谜列表中删除用户输入(BARM不是BARM的字谜)
您的问题是列表接口的contains实现了equals(),对于数组,比较的是两个char[]的内存地址。您需要做的是: 选项1)让您的程序使用数组.equals(char[]one,char[]two)将字典中的元素与输入进行比较,该数组将比较内容
选项2)不要比较字符[],而是使用字符串的equals()方法将其设置为比较字符串的点,该方法也会比较内容。这里有一个主要错误:
for (char[] c : dictionarySort) {
if (inputSort.contains(c)) { // BUG!
这不会像你想象的那样有效。这将测试列表中是否包含完全相同的char[]
对象;它不测试是否存在具有相同字符的字符数组
要按您想要的方式工作,请不要存储char[]
,而要存储Strings
要将字符[]
转换为字符串
,请执行以下操作:
char[] c;
String s = new String(s);
在数组中对字符进行排序后,将字符数组转换为字符串并将其存储在列表中。这意味着所有列表都应该是
列表的列表
感谢您的回复。我以前曾尝试过对哈希映射进行排序。我遇到的问题是,许多已排序的单词都是重复的,Hashmap不能有重复的键。我按字母顺序排列的目的是产生重复的字母,这就是我识别一个拼字的方式。关于如何克服这个障碍,你有什么建议吗?@dave制作一个HashMap,同时让关键字为原始单词,值为已排序的单词。例如:K:racoon,V:acknook。那么我该如何解决这个问题呢?谢谢,那么如何将列表转换为列表呢?看起来你已经解释过了,但能给我更多的细节吗?等等。我想我刚刚回答了我自己的问题。我已经从一个字符串转换成了一个字符…我想还是反过来吧?你转换成了Char[]
,这样你就可以对字符进行排序了,这很好,现在根据我的代码片段转换回来,并将新的字符串添加到你的“排序”列表中