我一直在尝试用Java编写一个字谜查找器,以便在编译之后在终端中我所要做的就是
java Anagramfind list.txt
treasure
austerer
yes/no
)list.txt文件包含大部分(如果不是全部)英语单词。
这是我到目前为止所拥有的......
import java.util.*;
import java.io.*;
class ProjectAnagram {
public static void main (String[] args throws IOException) {
//THis here declares an array of strings
Scanner dictionary = new Scanner new (fileInputStream(args[0]));
String[] entireArray = new String[173528]; //name of array + 173258
System.out.println ("Put something in please");
Scanner keyboard = new Scanner(System.in);
System.out.println ("Inserted");
String word = keyboard;
}
我还需要添加其余部分。
我在使用数组方面遇到了麻烦,我在这里引用:
我也无法使用Stringbuffer检查单词是否具有相同的字符。
程序检查输入字符串以及文本文件中的字符串是否具有相同的长度,以排除明显的非字谜。如果它没有,那么它会移动到列表中的下一个单词,可能在某个循环中有i++
。
答案 0 :(得分:1)
类似于查找两个字符串是否是彼此的排列,您可以对给定字符串的字符进行排序,并使其成为字谜列表的关键字。这样,无论字符串如何,您都只能找到由相同字符组成的相同长度的字符串。
类似的东西:
Map<String, List<String>> map ...
map.get(getKey(string)).get(i); // i = the ith request for an anagram
答案 1 :(得分:1)
Arrays.equals('Testing'.chars().sorted().toArray(), 'ingsetT'.chars().sorted().toArray())
答案 2 :(得分:1)
试试这个。
package stackoverflow;
import java.io.*;
import java.util.*;
public class ProjectAnagram {
static String sort(String s) {
char[] c = s.toCharArray();
Arrays.sort(c);
return String.valueOf(c);
}
public static void main(String[] args) throws FileNotFoundException {
Map<String, List<String>> words = new HashMap<>();
try (Scanner in = new Scanner(new File(args[0]))) {
while (in.hasNext()) {
String word = in.next();
String sorted = sort(word);
List<String> list = words.get(sorted);
if (list == null)
words.put(sorted, list = new ArrayList<>());
list.add(word);
}
}
Scanner in = new Scanner(System.in);
while (true) {
System.out.print("Enter word (or press ENTER to quit): ");
if (!in.hasNextLine()) break;
String s = in.nextLine();
if (s.length() == 0) break;
System.out.println(words.get(sort(s)));
}
}
}
答案 3 :(得分:0)
编辑:This answer is an efficient way to do it!
Hashmaps是O(1)查找时间。
我们需要3次迭代。首先将第一个字符串中的字符数添加到hashmap,第二个是从hashmap中删除第二个字符串中的字符数,第三个是遍历hashmap并查看所有值是否为0。
所以,这会给我们一个O(n)算法。