2016-03-22 10 views
1

私はAngular + Java(Oracle-RDBMS)でWebアプリケーションをやっています。あるページでは、Dtoに含まれているデータを、レスポンシブでブラウザに返信します(明らかにjsonに変換された後)。それは動作しますが、このDTOが含まれているオブジェクトのリストが含まれます。これは私が行うプロセスであるJavaのオブジェクトリスト内の項目をグループ化する

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

:「setFoods」前

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... 

を私はグループリストのためにしたいのですが食べ物。結果は、次の配列を含む新しい配列である必要があります。

| 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 

リストを「中断」してグループ化するにはどうすればよいですか?

答えて

0

'9'と '3'は合計の合計であるためです。順番に、これらの行にはすべての情報を含む部分配列が含まれていなければなりません。

あなたは食べ物によってグループに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); 
     } 
    } 
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を、必要な方法で表示するためのキーとしてのフード名を使用してマップする必要があります。

関連する問題