编写一个字谜查找器(来自 txt 文件中的单词列表)[重复]
Posted
技术标签:
【中文标题】编写一个字谜查找器(来自 txt 文件中的单词列表)[重复]【英文标题】:Writing an anagram finder (from a word list in a txt file) [duplicate] 【发布时间】:2016-08-25 22:58:21 【问题描述】:我一直在尝试用 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;
我还需要添加其余部分。
我在使用数组时遇到了很多问题,我在这里引用了它:
Java read file and store text in an array http://docs.oracle.com/javase/tutorial/essential/environment/cmdLineArgs.html What is "String args[]"? parameter in main method Java我也无法使用 Stringbuffer 检查单词是否具有相同的字符。
程序首先检查输入字符串和文本文件中的字符串是否具有相同的长度,以排除明显的非字谜。如果没有,那么它会移动到列表中的下一个单词,可能在某个循环中使用i++
。
【问题讨论】:
您的代码极难编译。请在您的帖子中修复您的代码。有很多语法错误。 其实是伪代码,哈哈 如果您提出 Java 问题,请发布 Java 代码。这个“伪代码”肯定在任何问题中都无效,因为存在不平衡的括号、不平衡的花括号等等。请修正您问题中的代码。 如果您打算检查每个元素(英语单词),您应该认真考虑我的回答。将字典存储在一个数组中,然后使用下面的其他算法是相当低效的,特别是如果字典是按字母顺序排列的。 【参考方案1】:类似于查找两个字符串是否是彼此的排列,您可以对给定字符串的字符进行排序,并将其作为字谜列表的键。这样,无论字符串如何,您都会发现只有相同长度的字符串由相同的字符组成。
类似:
Map<String, List<String>> map ...
map.get(getKey(string)).get(i); // i = the ith request for an anagram
【讨论】:
是的,它正在工作。谢谢你! @J.Doe,很高兴为您提供帮助。如果它被证明是最好的解决方案,请随时接受。【参考方案2】:Arrays.equals('Testing'.chars().sorted().toArray(), 'ingsetT'.chars().sorted().toArray())
【讨论】:
我是否错误地误解了排列和字谜之间的区别?它们不需要是有效词吗? 当然,ingsetT
不是一个有效的字谜,但每个字谜只是一个新词的排列,OP 与一个词表一起工作。
所以我可以分别用上面的变量word
和entirearray
代替Testing
和ingset
?
我不确定,因为您仍然没有修复上面的代码,所以不清楚什么是什么。但是如果word
是用户输入的单词,entirearray
是单词表的单词之一,那么是的。但是形成命名我猜entirearray
是整个词表,所以你会遍历entirearray
并检查每个条目与该行,当然你不应该为每个词表词的输入词做...toArray()
的东西,但只做一次就可以重复使用。
如果你经常检查整个单词表并且有足够的内存,那么在读取单词表并映射到原始单词之后,计算单词表单词的排序数组是值得的,然后只做反复搜索。然后,您甚至可以对已排序的列表进行排序并使用二进制搜索算法,或者您可以使用已排序的字符到单词的映射对您的单词列表文件进行拉皮条处理,这样您就不必在每次启动程序时都这样做。有很多方法可以优化这一点。【参考方案3】:
试试这个。
package ***;
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)));
【讨论】:
抱歉,由于某种原因,它没有编译。 还是谢谢你。我可以问为什么它不能编译,或者为什么static String sort(String s)
一直在顶部?
附上所有内容还是只附上static String sort(String s)
?
现在它在各个行都说cannot find symbol
。
哦,是的,我忘记导入了。谢谢!【参考方案4】:
编辑:This answer is an efficient way to do it!
哈希图的查找时间为 O(1)。
我们需要 3 次迭代。首先将第一个字符串中的字符数添加到 hashmap,第二个从 hashmap 中删除第二个字符串中的字符数,第三个遍历 hashmap 并查看所有值是否为 0。
所以,这会给我们一个 O(n) 算法。
【讨论】:
所以OO
是NP
的变位词?哈希算法非常弱。它最多可以作为指标,但您仍然需要比较字符。
@BjörnKautler 如果我们将其更改为:hash += Math.pow(str.charAt(i),2);
另外,this answer 似乎有效且有效
嗯,散列比较好,但我比较肯定它也有很多冲突。您可以使用 CRC 或 MD5 或 SHA-1 做得更好,但您做得越安全,需要的时间就越多。你也可以只使用我的单线,虽然我没有测试它的性能:-)
你的单线有排序,这将是 O(n log n)。我链接到的答案会将第一个字符串中的每个字符存储在哈希图中,然后从哈希图中删除第二个字符串中的每个字符,然后它会遍历哈希图并查看是否有任何值是 0> 这将是 O(n) .以上是关于编写一个字谜查找器(来自 txt 文件中的单词列表)[重复]的主要内容,如果未能解决你的问题,请参考以下文章