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

时间:2016-03-22 12:33:51

标签: java arrays oracle grouping rdbms

我正在使用Angular + Java(Oracle -RDBMS)进行Web应用程序。在页面中,我显示Dto中包含的数据,我在响应中发送回浏览器(显然,它转换为json后)。它可以工作,但是这个Dto包含一个包含以下内容的对象列表:

| FOOD | CUSTOMER | COUNT
  Apple     X         3
  Apple     y         1
  Apple     z         5
  Milk      j         2
  Milk      p         1

这是我的过程:

    List<FoodsDto> foods = new ArrayList<FoodsDto>();
    // I call the query to retrieve the list and I add it ordering for 'foods'...
    // Then I set it on the result 
    result.setFoods(developmentResult);
    // And i send the response on browser...

在'setFoods'之前,我想把食物清单分组。结果应该是一个包含以下内容的新数组:

| FOOD | CUSTOMER | COUNT
  Apple     X         3
  Apple     y         1
  Apple     z         5
  Milk      j         2
  Milk      p         1

  Apple  9
  Milk   3

'9'和'3'是计数的总和,所以总数。反过来,这些行必须包含一个包含所有信息的子数组。所以:

[Apple 9] --
           |--> Apple x 3
           |--> Apple y 1
           |--> Apple z 5

[Milk  3] --
           |--> Milk j 2
           |--> Milk p 1

如何“打破”列表并对其进行分组?

2 个答案:

答案 0 :(得分:0)

如果您不想创建单独的DTO,可以简单地遍历FoodsDto列表并使用其他Map<String, Integer>进行分组,如下所示。

Map<String, Integer> foodGroup = new HashMap<>();
 for(FoodsDto foodsDto : foods) {
    if(foodGroup.containsKey(foodsDto.getFood())){
       foodGroup.put(foodsDto.getFood(), (foodGroup.get(foodsDto.getFood()) + foodsDto.getCount())); 
    } else {
       foodGroup.put(foodsDto.getFood(), foodsDto.getCount());
    }
}

然后在您的回复中发送foodGroup。在前端(在Javascript / AngularJs中),您需要映射foodGroupfoods,使用食物名称作为键,以您希望的方式显示它。

答案 1 :(得分:0)

  

&#39; 9&#39;和&#39; 3&#39;伯爵是伯爵,所以总数。反过来,这些行必须包含一个包含所有信息的子数组。

您可以使用地图按食物分组FoodsDto项目:

    Map<FoodsDto, List<FoodsDto>> map = new HashMap<>();        

    for(FoodsDto o : developmentResult){
        // using the FoodsDto as the key
        if (map.get(o) != null) {
            map.get(o).add(o);
        } else {
            List<FoodsDto> foodList = new ArrayList<FoodsDto>();
            foodList.add(o);
            map.put(o, foodList);
        }
    }

    for (Map.Entry<FoodsDto, List<FoodsDto>> entry : map.entrySet()) {
        List<FoodsDto> list = entry.getValue();
        System.out.println(String.format("%s: %d", entry.getKey(), list.size()));

        for(FoodsDto f : list){
            System.out.println(f);
        }
    }