簡體   English   中英

在Java對象列表中對項目進行分組

[英]Group items in a list of objects in Java

我正在使用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

我該如何“破壞”列表並將其分組?

如果不想創建單獨的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 ,並使用food name作為鍵以所需方式顯示它。

'9'和'3'是計數的som,所以總數。 反過來,這些行必須包含一個包含所有信息的子數組。

您可以使用地圖按食物分組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);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM