根据对象值将对象列表压缩为的有效方法是什么

What is a efficient way to condense a List of objects to based on an object value?

本文关键字:对象 有效 方法 是什么 列表 压缩      更新时间:2023-09-26

我有一个对象数组列表。该对象有五个字段:id、日期、名称、值、adjusted_value。该列表可能包含多个具有相同名称的条目,我很难设计出一种有效的方法来根据名称将列表压缩到类似对象的列表,但存储的值将是name、sum(value)、sum(adjusted_value)。

有有效的方法吗?我当前的方法在do while内部有for循环。

Clarfification:

我有一个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中执行这种操作。

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

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

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

如果它已经添加到地图上,只需

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

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

我将分两步使用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