2016-03-22 3 views
1

Я делаю веб-приложение с Angular + Java (Oracle -RDBMS). На странице я отображаю данные, содержащиеся в Dto, которые я отправляю обратно в браузер в ответном сообщении (после того, как он, очевидно, был преобразован в json). Это работает, но это Dto содержит список объектов, содержащий:Элементы группы в списке объектов в Java

| 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 

Как это сделать, чтобы «разбить» список и сгруппировать его?

ответ

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) вам нужно отобразить foodGroup и foods, используя имя пищи в качестве ключа, чтобы отобразить его так, как вы хотите.

Смежные вопросы