【问题标题】:Convert String list to sorted Map String length as key将字符串列表转换为排序的映射字符串长度作为键
【发布时间】:2017-08-26 22:02:44
【问题描述】:

我有一个List<String>,我必须将它转换为Map,方法是将相同长度的Strings 分组为List,使用String 长度作为键,排序顺序。可以使用 -

Map<Integer, List<String>> result = new TreeMap<>();
for (String str : list) {
    if (!result.containsKey(str.length())) {
        result.put(str.length(), new ArrayList<>());
    }
    result.get(str.length()).add(str);
}

我们如何使用 Java 8 流来做到这一点?

【问题讨论】:

  • 你试过什么?你遇到了什么问题?您是否尝试在发帖前查找您的问题?

标签: lambda java-8 java-stream


【解决方案1】:

可以使用分组收集器将Java流分组为一个映射,最简单的方法是使用

Collectors.groupBy(comparator)

比较器将流式值转换为映射键。

返回是从比较键到条目列表的映射

public class Test {
  public static void main(final String... args) {
    List<String> in = Arrays.asList("A", "AB", "B", "ABC");
    final Map<Integer, List<String>> all = in.stream()
        .collect(Collectors.groupingBy(String::length));
    System.out.println(all);
  }
}

输出:

{1=[A, B], 2=[AB], 3=[ABC]}

【讨论】:

  • 我在 IDE 中将 JDK 9 设置为默认值,我已将 List.of 更改为 Arrays.asList,以使我的答案与 Java 8 兼容
【解决方案2】:

你可以用流来做到这一点:

Map<Integer, List<String>> result = list.stream()
    .collect(Collectors.groupingBy(
        String::length,        // use length of string as key
        TreeMap::new,          // create a TreeMap
        Collectors.toList())); // the values is a list of strings

这通过Collectors.groupingBy 的重载来收集流,该Collectors.groupingBy 接受3 个参数:键映射器函数、映射的提供者和下游收集器。

但是,有一种更紧凑的方法可以做到这一点,无需流:

Map<Integer, List<String>> result = new TreeMap<>();
list.forEach(s -> result.computeIfAbsent(s.length(), k -> new ArrayList<>()).add(s));

这使用List.forEachMap.computeIfAbsent 来实现你想要的。

【讨论】:

    【解决方案3】:

    您可以在 Java 8 中使用 groupingBy 一行来做到这一点。

    result = list.stream().collect(Collectors.groupingBy(String::length));
    

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2019-06-14
      • 1970-01-01
      相关资源
      最近更新 更多