我必须编写程序,该程序应该读取字谜的文件并显示单词和他的字谜。 Txt文件很大,使用扫描仪后,listOfWords的大小为:25000。

输出示例:

word anagram1 anagram2 anagram3 ...
word2 anagram1 anagram2...


我有代码,它可以运行,但是非常慢:

  private static List<String> listOfWords = new ArrayList<String>();
  private static List<ArrayList<String>> allAnagrams = new ArrayList<ArrayList<String>>();

  public static void main(String[] args) throws Exception {
    URL url = new URL("www.xxx.pl/textFile.txt");
    Scanner scanner = new Scanner(url.openStream());
    while (scanner.hasNext()) {
      String nextToken = scanner.next();
      listOfWords.add(nextToken);
    }
    scanner.close();

    while (listOfWords.isEmpty() == false) {
      ArrayList<String> anagramy = new ArrayList<String>();
      String wzor = listOfWords.remove(0);
      anagramy.add(wzor);
      char[] ch = wzor.toCharArray();
      Arrays.sort(ch);
      for (int i = 0; i < listOfWords.size(); i++) {
        String slowo = listOfWords.get(i);
        char[] cha = slowo.toCharArray();
        Arrays.sort(cha);
        if (Arrays.equals(ch, cha)) {
          anagramy.add(slowo);
          listOfWords.remove(i);
          i--;
        }
      }
      allAnagrams.add(anagramy);
    }

    for (ArrayList<String> ar : allAnagrams) {
      String result = "";
      if (ar.size() > 1) {
        for (int i = 1; i < ar.size(); i++) {
          result = ar.get(i) + " ";
        }
        System.out.println(ar.get(0) + " " + result);
      }
    }
  }


我必须使用Java 8-流来编写它,但我不知道。可以使用流来读取URL +搜索字谜吗?您能帮我按流搜索字谜吗?老师告诉我,阅读整个清单,代码应该比我的短。仅几行,这可能吗?

最佳答案

您可以将文件中的单词读入列表或直接创建它的流:

try (InputStream is = new URL("http://www.someurl.pl/file.txt").openConnection().getInputStream();
     BufferedReader reader = new BufferedReader(new InputStreamReader(is));
     Stream<String> stream = reader.lines()) {
       //do something with stream
}


然后只是流过列表并收集字谜,所有具有相同字符排序列表的单词都被视为字谜:

Map<String, List<String>> anagrams =
    stream.collect(Collectors.groupingBy(w -> sorted(w)));


sorted方法只是像示例中那样对字母进行排序:

public static String sorted(String word) {
    char[] chars = word.toCharArray();
    Arrays.sort(chars);
    return new String(chars);
}

关于java - 使用Java 8搜索字谜,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40756599/

10-10 10:18