Java 编写字谜查找器(从txt文件中的单词列表)

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编写一个字谜查找程序,这样在终端编译之后,我所要做的就是

  • 键入
    java Anagramfind list.txt
  • 当提示输入单词时,说
    treasure
  • 程序打印一个字谜,如
    ostrer
  • 另一个提示出现,询问我是否想要另一个(
    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++

    编辑:

    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)));
            }
        }
    }