什么是基于对象值压缩对象列表的有效方法?

时间:2014-10-30 13:36:17

标签: java javascript list arraylist collections

我有一个对象的ArrayList。该对象有五个字段:id,date,name,value,adjusted_value。该列表可能包含多个具有相同名称的条目,我无法设计一种有效的方法来根据名称将列表压缩到类似对象列表的位置,但存储的值将是name,sum(value),总和(adjusted_value)。

有一种有效的方法吗?我当前的方法在do-while中有for循环。

Clarfication:

我有一个obejcts列表:

    {id,date,name,value,ajusted_value},
    {1,"10/30/2014","peaches",4,3}
    {2,"10/30/2014","apples",2,2}
    {3,"10/31/2014","peaches",3,1}
    .
    .
    .

我想压缩到基于名称值的列表,看起来像这样:

   {null,null,"peaches",7,4}
   {null,null,"apples",2,2}
   .
   .
   .

但是,我发现HashMap的put()功能会自动执行我想要的功能,但现在我需要在Javascript中执行此类动作。

2 个答案:

答案 0 :(得分:2)

您可以定义一个Map,其中键是name,value是对象实例。

浏览列表,并为每个实例检查它是否存在于地图中。

如果不只是添加到地图。 map.put(instance.name,instance)

如果它已经添加到地图中

mapInstance=map.get(instance.name);
mapInstance.value+=instance.value;
mapInstance.adjusted_value+=instance.adjusted_value;

在循环之后,您将获得带有分组数据的填充地图

答案 1 :(得分:1)

我会分两步使用Guava。使用NameFunction将列表转换为Multimap。使用CondenseFunction转换Multimap

的值
  Function<MyClass, String> toName = new Function(){ 
        public String apply(MyClass input){return input.name;}};

  ImmutableListMultimap<String, MyClass> multimap = Multimaps.index(myList, toName);

  Map<String, Collection<MyClass>> map = multimap.asMap();

  Function<Collection<MyClass>, MyClass> condense= new Function(){ 
        public MyClass apply(Collection<MyClass>input){
          // create sums here
  }};

   Map<String, MyClass> condensed = Maps.transformValues(map, condense);
   Collection<MyClass> result = condensed.getValues();

Multimaps.index()

Maps.transformValues