【问题标题】:Assign all values in a Set<String> to a Map<String, String> with streams将 Set<String> 中的所有值分配给带有流的 Map<String, String>
【发布时间】:2019-02-14 12:40:44
【问题描述】:

我有一个 list1 包含不同的字符串,这些字符串以另一个列表 (fooBarList) 中的字符串开头。

List<String> list1 = Arrays.asList("FOO1234", "FOO1111", "BAR1", "BARRRRR");
List<String> fooBarList = Array.asList("FOO", "BAR");

我想创建一个Hashmap&lt;String, List&lt;String&gt;&gt; hm,它根据字符串的开头将字符串与 list1 分开。

结果应如下所示:

{FOO=["FOO1234",FOO1111"], BAR=["BAR1", "BARRRRR"]}

fooBarList 定义了不同的键。

如何在流的帮助下实现这一目标?我只是不知道如何执行我基本上说的步骤: FOO1234 以 FOO 开头,因此请检查键 FOO 是否存在并将其添加到列表中,否则创建一个新列表。 (我想我必须在流中迭代 fooBarList,这对我来说似乎是错误的)

/edit:确定 fooBarList 中只有 2 个值,我可以做简单的检查,如果字符串以“foo”开头,然后执行此操作。但是如果我的列表包含 100 个字符串呢?

【问题讨论】:

  • 如果第二个列表同时包含“FOO”和“FOO1”怎么办。您如何决定为“FOO1234”选择哪个键?
  • 这可以忽略,因为它不会发生。我有几个非常独特的键。
  • 这些键是否都具有相同的长度(例如,在您的示例中为 3)?
  • 不,长度可能因键而异。

标签: java java-8 java-stream


【解决方案1】:

一个简单的Collectors::groupingBy 就可以解决问题:

Map<String, List<String>> prefixGrouping = list1.stream()
    .collect(
        Collectors.groupingBy(
            item -> fooBarList.stream().filter(item::startsWith).findFirst().orElse("")
        )
    );

输入:list1=["FOO1234", "FOO1111", "BAR1", "BARRRRR", "LOL"], fooBarList=["FOO", "BAR"]

输出:{""=["LOL"], "BAR"=["BAR1", "BARRRRR"], "FOO"=["FOO1234", "FOO1111"]}


你在分组函数中查找前缀,如果没有匹配到前缀,则进入emtpyStringbin。

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 2019-08-26
    • 2021-09-06
    • 2021-04-26
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多