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

在Java中对列表中的项目进行分组

谢鸿
2023-03-14

我有一个对象列表list mList=new arraylist<>();

public class WorkingActivityModel {
   private String name;
   private Sales sales;
   private Shifts shifts;
}

销售模式为:

public class Sales {
    private int product1;
    private int product2;
}

轮班模式为:

public class Shifts {
    private int shift1;
    private int shift2;
}

如何按名称对list mlist 中的项目进行分组,然后对相应的销售和班次进行求和?所以,如果我在列表中有两个名称相同的项目,那么将它们分组,并求和其销售额和移动量?

我尝试过stream,但没有成功:

List<WorkingActivityModel> result = mList.stream()
                        .collect(groupingBy(WorkingActivityModel::getName, LinkedHashMap::new, toList()))
                        .values().stream()
                        .flatMap(Collection::stream)
                        .collect(toList());

另一种选择是:

List<WorkingActivity> mList = new ArrayList<>();

HashMap<String, List<WorkingActivityModel>> map = new HashMap<>();

for(WorkingActivityModel o : mList){
    if (!map.containsKey(o.getKey())) {
        List<WorkingActivityModel> list = new ArrayList<>();
        list.add(o);

        map.put(o.getKey(), list);
    } else {
        map.get(o.getKey()).add(o);
    }
}

在这种情况下,我不知道如何求和相应的销售额和班次

编辑

下面是预期结果的示例:

共有1个答案

葛言
2023-03-14

您可以使用定义的自定义合并操作来实现这一点,这样执行tomap就会稍微容易一些。

Collection<WorkingActivityModel> result = mList.stream()
        .collect(Collectors.toMap(WorkingActivityModel::getName, Function.identity(),
                (a, b) -> WorkingActivityModel.mergeModels(a, b))) // WorkingActivityModel::mergeModels
        .values();

mergeModels是我在workingactivitymodel类中定义的一个静态方法,例如它处理合并两个名称相似的模型的逻辑。

static WorkingActivityModel mergeModels(WorkingActivityModel model1, WorkingActivityModel model2) {
    return new WorkingActivityModel(model1.name,
            Sales.mergeSales(model1.sales, model2.sales),
            Shifts.mergeShifts(model1.shifts, model2.shifts));
}

当然,mergesalesmergeshifts遵循相同的模式,实现起来很简单。

 类似资料:
  • 给定一个< code>java.util.List和< code>n个元素以及一个期望的页面大小< code>m,我想将它转换成一个包含< code>n/m n%m个元素的映射。每个地图元素应包含< code>m个元素。 这里有一个整数的例子: 使用Java 8,这是可能的吗?

  • 问题内容: 给定一个with 元素和所需的页面大小,我想将其转换为包含元素的地图。每个地图元素应包含元素。 这是一个整数示例: 使用Java 8可以吗? 问题答案: 您可以将其与收集器和方法结合使用(感谢Duncan的简化)。 首先,您需要计算地图中所需的键数。这是通过(这是流的限制)给出的。 然后,您创建一个创建序列的Stream 。 现在,对于每个值,您将抓住对应的值,这将是我们的值(您需要对

  • 本文向大家介绍在Java中使用Collections.reverseOrder()对ArrayList的项目进行排序,包括了在Java中使用Collections.reverseOrder()对ArrayList的项目进行排序的使用技巧和注意事项,需要的朋友参考一下 为了在Java中使用Collections.reverseOrder()对ArrayList的项目进行排序,我们需要使用Collec

  • 问题内容: 我具有以下数据结构(列表列表) 我希望能够 使用函数对列表重新排序,以便我可以按列表中的每个项目分组。例如,我希望能够按第二列分组(以便所有21列在一起) 使用函数仅显示每个内部列表中的某些值。例如,我想减少此列表,使其仅包含“ 2somename”的第四个字段值 所以列表看起来像这样 问题答案: 对于第一个问题,您应该做的第一件事是使用运算符模块中的itemgetter按第二个字段对

  • 使用以下代码: 我得到: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23。 我想做的是每 10 个项目中断一次行,以便获得: 0,1,2,3,4,5,6,7,8,9, 10,11,12,13,14,15,16,17,18,19, 20,21,22,23. 我在谷歌搜索后尝试了很多事情,但都没有成功!你能帮助我吗? 谢谢 奥

  • 问题内容: 是否可以在Python中以以下方式迭代列表(将此代码作为伪代码进行处理)? 它应该产生 问题答案: 从食谱: