【问题标题】:Given a list of strings, is it feasible to get in one line a map from each length to the set of strings having that length, sorted by length?给定一个字符串列表,是否可以在一行中获得从每个长度到具有该长度的字符串集的映射,按长度排序?
【发布时间】:2020-07-08 15:36:29
【问题描述】:

我想出了以下方法,它确实有效,但我觉得应该有一种更干净的单线方式,不依赖于“外部”地图(下面的result):

public TreeMap<Integer, HashSet<String>> mapLenToString(List<String> strings){
    TreeMap<Integer, HashSet<String>> result = new TreeMap<>();
    strings.stream()
           .forEach(s -> { 
                int len = s.length();
                if (result.containsKey(len)) {
                    HashSet<String> larger = result.get(len);
                    larger.add(s);
                    result.replace(len, larger);
                }
                else {
                    HashSet<String> newSet = new HashSet<>();
                    newSet.add(s);
                    result.put(len, newSet);
                }
                
            });
    return result;
}

【问题讨论】:

  • 顺便问一下,HashSet是绝对必要的吗?
  • @user 不,只是将它用于larger.add(s) 行。

标签: java java-stream treemap one-liner


【解决方案1】:

只需使用groupingBy 收集器。您可以控制地图的类型和收集元素的集合类型。

TreeMap<Integer, HashSet<String>> result = strs
  .stream()
  .collect(
    Collectors.groupingBy(
      s -> s.length(),
      TreeMap::new,
      Collectors.toCollection(HashSet::new)
    )
  );

使用这个

List<String> strs = Arrays.asList(
  "DEF", "ABC", "Hello world", "z", 
  "a", "q", "90", "12345678910", "ab");

输出是

{1=[a, q, z], 2=[90, ab], 3=[ABC, DEF], 11=[12345678910, Hello world]}

Link to repl.it


您也可以使用Collectors.toSet() 代替toCollection(HashSet::new),其中默认实现是HashSet(但可能不保证是这样)

【讨论】:

  • 请问为什么这个答案不正确?它似乎符合 OP 的要求(按键排序的 TreeMap&lt;Integer, List&lt;String&gt;
  • 对我来说看起来非常好,比我的要好。
【解决方案2】:

使用 Guava Multimaps 的替代方法: com.google.common.collect.Multimaps.index(iterable, function)-

Multimap<Integer, String> index =
       Multimaps.index(strs,  s -> s.length());

不幸的是,它没有按结果排序。

【讨论】:

  • OP 似乎并不关心对结果进行排序,所以这应该还是可以的
  • 但是 OP 关心的是键的排序顺序,TreeMap 保证,Multimaps.index 不保证。
猜你喜欢
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2021-05-26
  • 2015-06-29
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多