当前位置: 首页 > 知识库问答 >
问题:

按多个键流分组

阙奇思
2023-03-14
List<String> strings = ImmutableList.of("A", "AA", "AAA", "B", "BB", "BBB", "C", "CC", "CCC", "ABA", "BAB", "CAC");

Map<Character, Map<Integer, List<String>>> collect = strings.stream().collect(
        groupingBy(s -> s.charAt(0),
                groupingBy(String::length)
        )
);

这将产生以下结果

My Map =
{
    A =
    {
        1 = [A]
        2 = [AA]
        3 = [AAA, ABA]
    }
    B =
    {
        1 = [B]
        2 = [BB]
        3 = [BBB, BAB]
    }
    C =
    {
        1 = [C]
        2 = [CC]
        3 = [CCC, CAC]
    }
}

我所感兴趣的实际上只是上面结果中的列表,我希望理想地将其作为groupby操作的一部分来完成。我知道这是可以做到的,例如,通过循环结果映射结构。但是有没有一种方法可以使用流来实现它呢?

 [
     [A],
     [AA],
     [AAA, ABA],
     [B],
     [BB],
     [BBB, BAB],
     [C],
     [CC],
     [CCC, CAC]
 ]

共有1个答案

许嘉珍
2023-03-14

不是使用级联的集合器创建嵌套组。groupingby,而是应按复合键进行分组:

Map<List<Object>, List<String>> map = strings.stream()
        .collect(Collectors.groupingBy(s -> Arrays.asList(s.charAt(0), s.length())));

然后,简单地抓取地图值:

List<List<String>> result = new ArrayList<>(map.values());

如果您使用的是Java9+,您可能希望从arrays.aslist更改为list.of来创建复合键。

 类似资料:
  • 问题内容: 我有以下方法可以在Angular中捕获按键: 我听着 但是,我想检测何时同时按下两个键,例如和同时按下(不是一个一个又一个又一个的组合)。 最好的方法是什么? 编辑 我当时想的是: 因此,如果我有多个按键,那么我将创建正确的。但是,问题在于,现在顺序很重要(即,如果我按then ,则按is ;如果我按另一种方式按,则得到) 问题答案: 我认为广播使用过多。而是使用自定义指令?这是一个用

  • 我可以同时使用和吗?

  • 有没有非终端版本的或其他一些简洁的方式来流式传输生成的Map条目/值? 我发现自己想在分组后流过值但我能想到的最好的方法并不漂亮:

  • 问题内容: 我发现的唯一接近的事情是:Elasticsearch中的多个分组方式 基本上,我试图获得与以下查询等效的ES : 年龄和性别本身很容易获得: 这使: 但是现在我需要这样的东西: 请注意,这是针对年龄范围的“映射”,因此它们实际上表示的是:)而不是数字。例如,性别[1](“男性”)细分为[246]的年龄范围[0](“18岁以下”)。 问题答案: 由于您只有2个字段,因此一种简单的方法是使

  • 我有以下文件: 如何发出请求,将Sigle\U 1和Sigle\U 2连接起来,并将值reslut分组? 预期结果示例: 我试过了,但还不完全

  • 问题内容: 是否有可能结合按键的组合来触发单个事件? 我已经在Chrome浏览器中尝试过,但该事件不会触发。 称我为疯狂,但我正在编写Chrome扩展程序,并希望同时按下+ + 键将其强制为隐藏的开发人员模式。 问题答案: 如果要检测的,和钥匙都在同一时间全部下来,你得看都和并保持地图为down的那些的。当他们全都崩溃时,请触发您的事件。 我假设您不关心它们按什么顺序按下(因为要可靠地按一下会很痛