为了账号安全,请及时绑定邮箱和手机立即绑定

如何对字符串数组列表、java 8 或 java 11 进行分组

如何对字符串数组列表、java 8 或 java 11 进行分组

沧海一幻觉 2022-07-06 18:45:49
{username,order} 尝试按用户名对它们进行分组。List<String[]> orders = new ArrayList<>();            String[] o1 = {"john, apple"};            String[] o2 = {"john, Orange"};            String[] o3 = {"jane , banana"};            String[] o4 = {"jane, Orange"};            orders.add(o1);            orders.add(o2);            orders.add(o3);            orders.add(o4);可以说如果我有以下订单并且我想得到这个List<List<String[]>> groupedOrders = new ArrayList<>();    groupedOrders.add(Arrays.asList(o1,o2));    groupedOrders.add(Arrays.asList(o3,o4));所以我正在寻找的结果是groupedOrders,就像上面的一个或在地图中一样,只要订单列表分组在一起如何将上面的订单列表转换为groupOrders,我曾尝试使用地图或流但不能让它工作。
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

我建议不要通过使用自定义类来使用数组:


class Order {

    String username;

    String order;

}

我省略了 getter、setter、修饰符和构造函数,因为这两个字段是该类的主要组成部分。


然后,您可以在List<Order> orders其中添加所有订单,从那里按名称对它们进行分组相当容易:


Map<String, List<Order>> grouped = orders.stream()

    .collect(Collectors.groupingBy(Order::getUsername));

如果你只想要实际的订单,比如banana,apple等等,你可以使用这个:


Map<String, List<String>> grouped = orders.stream()

    .collect(Collectors.groupingBy(

        Order::getUsername, 

        Collectors.mapping(Order::getOrder, Collectors.toList())

    ));

如果你真的想使用数组作为你的输入,你也可以使用这个:


Map<String, List<String>> grouped = Arrays.stream(orders)

    .collect(Collectors.groupingBy(

        a -> a[0], 

        Collectors.mapping(a -> a[1], Collectors.toList())

    ));


查看完整回答
反对 回复 2022-07-06
?
互换的青春

TA贡献1797条经验 获得超6个赞

请注意,您的数组String[] o1 = {"john, apple"};只有 1 个元素,您可能需要类似{"john", "apple"}. 注意报价。

我也会推荐@Lino 的解决方案,但它可以用数组来完成:

Map<String, List<String[]>> map = orders.stream()
            .collect(Collectors.groupingBy(s -> s[0]));


查看完整回答
反对 回复 2022-07-06
  • 2 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信