2014-10-30 50 views
-1

我有一个ArrayList的对象。该对象有五个字段:id,日期,名称,值,adjusted_value。该列表可能会保存多个具有相同名称的条目,并且我无法设计出一种有效的方式来将名单压缩到基于名称的位置,而我将查找类似对象的列表,但存储的值将是名称,总和(值),总和(adjusted_value)。基于对象值浓缩对象列表的有效方法是什么?

有没有一种有效的方法来做到这一点?我当前的方法有一个do-while内部的循环。

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中执行此类操作(如果可能)。

+0

也许是我,但我不是你的问题/问题是什么完全清楚。如果您很快就没有得到正确的答案,请澄清。 – 2014-10-30 13:40:44

+0

@HovercraftFullOfEels猜它应该是一种GROUP BY逻辑 – StanislavL 2014-10-30 13:42:58

+0

@StanislavL:谢谢,你可能是正确的(按照惯例)。 – 2014-10-30 13:43:58

回答

2

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

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

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

如果它已经添加到地图只是

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

循环之后你有分组数据

+0

这是使用'Multimap'的绝好机会。 – 2014-10-30 13:51:13

+0

在这里留下这个例子,我打算发布:http://ideone.com/H4PENZ – zapl 2014-10-30 14:02:28

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

+0

解决方案会比我的慢得多。我建议一种方法来在一个循环中获得总和。 BTW浓缩函数应该返回MyClass而不是String – StanislavL 2014-10-30 13:58:37

+0

我同意WRT的性能。然而,我认为这是一个更简单,更容易出错的解决方案,因为'Multimap'负责检查密钥是否存在。代码只需要担心获得密钥和组合值。也就是说,如果你对函数式编程很酷,那么以上就是合理的。 ;)干杯。 – 2014-10-30 14:18:32

相关问题