java - 当键从列表派生时如何迭代 Guava MultiMap

标签 java guava

我有一个包含订单日期和订单值(value)的订单列表。如何按订单日期分组并计算每个订单日期的总订单值(value)。我怎样才能在 Google Guava 中实现这一目标?如果事情变得复杂......我如何在 Java 集合中实现这一点?

订购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?

最佳答案

我认为 Guava 不一定是这里最好的工具...也不是任何法线贴图,就此而言:如果您有大量订单,您应该考虑使用 Java8 Streams,这将使您能够并行化你的计算。它还将对原始类型(int 与 Integer)进行优化...

无论如何,对于您描述的特定用例并遵循您发布的起始代码,这里是一个潜在的解决方案(使用 LocalDate 而不是 Date 只是因为它更方便):

@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));
}

关于java - 当键从列表派生时如何迭代 Guava MultiMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33040862/

相关文章:

java - 选择不属于关系表一部分的表属性

java - Saxon:将 xdmNode 转换为 org.w3c.dom.Node

java - 将此 Java Swing 应用程序转变为沙盒可嵌入(小程序或 Web Start)的最佳方法是什么?

java - 在 GWT 中使用 Google Common Collection

java - 在 Guava 中,如何创建具有单个元素和 n 次出现的 Multiset

java - 设置 SQL Server 以与 Java 连接

java - 程序将一个字符添加到字符串,然后通过 toString() 方法显示结果,并通过 length() 计算字符串的数量

java - 结合 guava 的 ImmutableList 和 varargs

java - 将多个集合合并为一个集合?

java - 检查 Map 不包含 null 键和值