将以相同字符开头的每个键映射到WordList



您将如何编码地图,以使每个单词映射的初始字符都符合整个单词?

考虑包含:

的单词列表
  • 艾伯特
  • ben
  • 爱丽丝
  • 塞西莉亚

输出应为{a=[albert,alice], b=[ben], c=[cecilia]}

这是我现在拥有的,但我不明白如何将每个键映射到所有通讯单词。

地图是类型Map<String, List<String>> bigMap;

 protected WordStore(String file) {
    this.bigMap = new HashMap<>();
    String line = "";
    try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file));)
    {
        this.wordlist = new ArrayList<String>();
        wordlist.add(file);
        while ( (line = bufferedReader.readLine()) != null){
                bigMap.putIfAbsent(String.valueOf(line.charAt(0)), new ArrayList<>());
            }
    }

读取所有行并将其添加到List<String>中。完成此操作后,您可以使用groupingBy收集器完成手头的任务。

this.bigMap = myList.stream()
                    .collect(Collectors.groupingBy(s -> s.substring(0, 1)));

,或者您可以读取文件,然后将所有内容分组如下:

try (Stream<String> stream = Files.lines(Paths.get(file))) {
     this.bigMap = stream.collect(Collectors.groupingBy(s -> s.substring(0, 1)));
} catch (IOException e) {
      e.printStackTrace();
}

或:

try (BufferedReader br = Files.newBufferedReader(Paths.get(file))) {
            this.bigMap = br.lines()
                            .collect(Collectors.groupingBy(s -> s.substring(0, 1)));
} catch (IOException e) {
     e.printStackTrace();
}

您可以在没有BufferedReader的情况下完成此操作,然后简化您的整个代码:

protected WordStore(String file) {
    this.bigMap = Files.lines(Paths.get(file))
                  .collect(Collectors.groupingBy(word -> word.substring(0, 1)));    
}

最新更新