用Java将列表中的项目分组 [英] Group items in a list in Java

查看:83
本文介绍了用Java将列表中的项目分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个对象列表List<WorkingActivityModel> mList = new ArrayList<>();

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

销售模式为:

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

Shifts模型是:

The Shifts model is:

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

如何按名称对List<WorkingActivity> mList中的项目进行分组,然后对相应的销售额和班次求和?因此,如果我在列表中有2个同名商品,则将它们分组并汇总其销售额和班次?

How can I group items in List<WorkingActivity> mList by name and then sum corresponding sales and shifts? So if I have 2 items in the list with the same name then group them and sum its sales and shifts?

我尝试了流式传输,但没有成功:

I have tried stream but with no success:

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);
    }
}

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

In this case, I don't know how to sum corresponding sales and Shifts

修改

下面是预期结果的示例:

below an example of the expected result:

推荐答案

您可以使用定义的自定义合并操作来做到这一点,从而使toMap的执行变得稍微容易一些.

You can do that using a custom merge operation defined such that performing toMap becomes slightly easier.

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

mergeModels是我在WorkingActivityModel类中定义的静态方法,例如它处理了合并两个相似命名的模型的逻辑.

The mergeModels is a static method that I have defined within WorkingActivityModel class such as it deals with the logic of merging two similarly named models.

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遵循相同的模式,实现起来很简单.

Of course, the mergeSales and mergeShifts follow the same pattern and are trivial to implement.

这篇关于用Java将列表中的项目分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆