2015-10-09 4 views
1

У меня есть список заказов с датой заказа и порядковым номером. Как мне группировать по дате заказа и вычислять общую стоимость заказа за дату заказа. Как я могу добиться этого в Google Guava? Если это усложняет ... как я могу добиться этого в сборниках Java?Как перебрать guava MultiMap, когда ключ получен из списка

Заказать POJO

Date date; 
Integer Value; 

Util.java

ListMultimap<Date, Integer> listMultiMap = ArrayListMultimap.create(); 
    for(Order o : orders){ 
     listMultiMap.put(o.date, o.value); 
    } 
    //Now how do I iterate this listMultiMap and calculate the total value? 

ответ

1

Я не думаю, что Гуава обязательно является лучшим инструментом здесь ... ни любая нормальная карта, по этому вопросу: если вы будете имеют огромное количество ордеров, вы должны подумать об использовании потоков Java8, которые позволят вам распараллеливать ваши вычисления. Он также будет иметь оптимизацию в отношении примитивных типов (int vs. Integer) ...

В любом случае, в конкретном примере использования, который вы описываете, и после начального кода, который вы опубликовали, здесь это потенциальное решение (вместо этого, используя LocalDate от Даты только потому, что это более удобно):

@Test 
public void test(){ 

    // Basic test data 
    Order today1 = new Order(LocalDate.now(),1); 
    Order today2 = new Order(LocalDate.now(),2); 
    Order today3 = new Order(LocalDate.now(),5); 
    Order tomorrow1 = new Order(LocalDate.now().plusDays(1),2); 
    Order yesterday1 = new Order(LocalDate.now().minusDays(1),5); 
    Order yesterday2 = new Order(LocalDate.now().minusDays(1),4); 
    List<Order> list = Lists.newArrayList(today1,today2,today3,tomorrow1,yesterday1,yesterday2); 

    // Setup multimap and fill it with Orders 
    ListMultimap<LocalDate, Integer> mm = ArrayListMultimap.create(); 
    for(Order o : list){ 
     mm.put(o.date,o.value); 
    } 

    // At this point, all you need to do is, for each date "bucket", sum up all values. 
    Map<LocalDate, Integer> resultMap = Maps.newHashMap(); 
    for(LocalDate d : mm.keySet()){ 
     List<Integer> values = mm.get(d); 
     int valuesSum = 0; 
     for(int i : values){ 
      valuesSum += i; 
     } 
     resultMap.put(d,valuesSum); 
    } 

    /* 
    * Result map should contain: 
    * today -> 8 
    * tomorrow -> 2 
    * yesterday -> 9 
    * */ 
    assertThat(resultMap.size(), is(3)); 
    assertThat(resultMap.get(LocalDate.now()), is(8)); 
    assertThat(resultMap.get(LocalDate.now().minusDays(1)), is(9)); 
    assertThat(resultMap.get(LocalDate.now().plusDays(1)), is(2)); 
} 
Смежные вопросы