编写anagram finder(来自txt文件中的单词列表)

时间:2016-04-30 22:48:25

标签: java arrays stringbuffer anagram

我一直在尝试用Java编写一个字谜查找器,以便在编译之后在终端中我所要做的就是

  1. 输入java Anagramfind list.txt
  2. 当提示输入单词时,请说出treasure
  3. 该程序打印一个字谜,如austerer
  4. 另一个提示是询问我是否想要另一个(yes/no
  5. 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++

4 个答案:

答案 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)算法。