Java 编写字谜查找器(从txt文件中的单词列表)
我一直在尝试用Java编写一个字谜查找程序,这样在终端编译之后,我所要做的就是Java 编写字谜查找器(从txt文件中的单词列表),java,arrays,stringbuffer,anagram,Java,Arrays,Stringbuffer,Anagram,我一直在尝试用Java编写一个字谜查找程序,这样在终端编译之后,我所要做的就是 键入java Anagramfind list.txt 当提示输入单词时,说treasure 程序打印一个字谜,如ostrer 另一个提示出现,询问我是否想要另一个(yes/no) 如果不是全部的话,list.txt文件包含英语中的大部分单词 这是我到目前为止所拥有的 import java.util.*; import java.io.*; class ProjectAnagram { public st
java Anagramfind list.txt
treasure
ostrer
yes/no
)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;
}
我还需要补充剩下的
我在使用数组方面遇到了很多问题,我在这里提到了:
i++
。编辑:
Hashmaps是O(1)查找时间
我们需要3次迭代。首先将第一个字符串中的字符计数添加到hashmap,第二个从hashmap中删除第二个字符串中的字符计数,第三个遍历hashmap并查看是否所有值都为0
因此,这将为我们提供一个O(n)算法。类似于发现两个字符串是否是彼此的排列,您可以对给定字符串的字符进行排序,并将其作为一个字谜列表的键。这样,无论字符串是什么,您都只能找到由相同字符组成的相同长度的字符串 比如:
Map<String, List<String>> map ...
map.get(getKey(string)).get(i); // i = the ith request for an anagram
地图。。。
map.get(getKey(string)).get(i);//i=对字谜的第i个请求
试试这个
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)));
}
}
}
包堆栈溢出;
导入java.io.*;
导入java.util.*;
公共类投影图{
静态字符串排序(字符串s){
char[]c=s.toCharArray();
数组。排序(c);
返回字符串.valueOf(c);
}
公共静态void main(字符串[]args)引发FileNotFoundException{
Map words=newhashmap();
try(Scanner in=new Scanner(新文件(args[0])){
while(在.hasNext()中){
字符串word=in.next();
字符串排序=排序(单词);
List=words.get(排序);
if(list==null)
put(排序,list=newarraylist());
列表。添加(word);
}
}
扫描仪输入=新扫描仪(系统输入);
while(true){
系统输出打印(“输入word(或按Enter键退出):”;
如果(!in.hasNextLine())中断;
字符串s=in.nextLine();
如果(s.length()==0)中断;
System.out.println(words.get(sort(s));
}
}
}
您的代码极不可编译。请在您的帖子中修复您的代码。有很多语法错误,实际上是伪代码,如果你问Java问题,请发布Java代码。这个“伪代码”肯定在任何问题上都是无效的,因为存在不平衡的偏执、不平衡的大括号等等。请在你的问题中修正代码。如果你打算复习每一个元素(英语中的单词),你应该认真考虑我的答案。将字典存储在一个数组中,然后使用下面的其他算法是相当低效的,特别是如果字典是按字母顺序排列的。因此OO
是NP
的一个字谜?散列算法非常弱。它最多可以用作指示符,但您仍然需要比较字符。@BjörnKautler如果我们将其更改为:hash+=Math.pow(str.charAt(i),2)代码>或者,它似乎可以工作并且很有效。不过,哈希比较好,但我相对确定它也有很多冲突。您可以使用CRC、MD5或SHA-1使其变得更好,但越安全,需要的时间就越多。您也可以只使用我的单行程序,尽管我没有测试它的性能:-)您的单行程序具有排序,将是O(n log n)。我链接到的答案是将第一个字符串中的每个字符存储在hashmap中,然后从hashmap中删除第二个字符串中的每个字符,然后在hashmap上迭代,看看是否有值为0>这将是O(n);它们不需要是有效的单词吗?诚然,ingsetT
不是一个有效的字谜,但每个字谜都只是一个新单词的排列,OP与单词列表一起工作。因此,在测试和ingset
的地方,我可以用变量word
和entirearray
替换它,分别?我不确定,因为您仍然没有修复上面的代码,所以不清楚是什么。但是如果word
是用户输入的单词,并且entirearray
是单词列表中的一个单词,则是。但是从命名的角度来看,我想entireaRay
是整个单词列表,所以你可以循环entireaRay
并用那一行检查每个条目,当然你不应该为每个单词列表的输入单词做…toArray()
之类的事情,如果你经常检查整个单词表,并且有足够的内存,那么在阅读单词表并映射到原始单词后,计算一次单词表单词的排序数组,然后只重复搜索是值得的。然后你甚至可以对排序后的列表进行排序,并使用二进制搜索算法,或者你可以用排序后的字符到单词的映射来填充你的单词列表文件,这样你就不必在每次程序启动时都这样做了。有很多方法可以优化它。很抱歉,出于某些原因,它没有编译。无论如何,谢谢你。我可以问一下为什么它不会编译,或者为什么静态字符串排序(strings)
一直位于顶部吗
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)));
}
}
}