2016-03-04 81 views
-2
MyObject structure is: 

public class MyObject { 
String gender; 
String state; 
    int quantity; 
    int Salary;} 

我有以下功能。它允许我在我的对象的性别和状态维度内汇总数据:计算平均值,同时汇总数据

private static Collection<MyObject> aggregate(List<MyObject> objects) { 

     int nombre=0; 
     Map<String, MyObject> map = new HashMap<String, MyObject>(); 

     for (MyObject current : objects) { 
      String key = String.format("%s:%s", current.gender, current.state); 
      MyObject aggregated = map.get(key); 
      if (aggregated == null) { 
       aggregated = new MyObject(); 
       aggregated.setGender(current.getGender()); 
       aggregated.setState(current.state); 
       map.put(key, aggregated); 

      } 
      if(current.getSalary()!=0) 
       nombre+=1; 

      aggregated.setQuantity(aggregated.getQuantity() + current.getQuantity()); 
      aggregated.setSalary((aggregated.getSalary() + current.getSalary())/nombre); 

     } 
     return map.values(); 
    } 

我在寻找获得聚合数据的平均工资。 “nombre”属性有问题。

其实它给了我下面的结果:agregation后

element : 1 M 40 1200 
element : 1 F 35 2000 
element : 1 M 20 200 
element : 1 M 80 300 
element : 1 F 35 2000 

内容:

`element : 1 M 140 333 
element : 1 F 70 2000` 

但是我期待: element : 1 M 140 566 element : 1 F 70 2000

+1

如果有什么不对的地方,你需要提供一些东西;) - 严重的是,更具体:什么是错的?你得到的任何错误?不希望的输出(如果是这样,那么你期望什么,你会得到什么)? – Thomas

+0

'current.getSalary()'返回什么? – 2016-03-04 14:44:39

+0

@托马斯没有得到所需的输出。 正如你所说,我想在计算所有工资之后的平均值,同时getSalary()返回一个int值 –

回答

0
private static Collection<MyObject> aggregate(List<MyObject> objects) { 
     Map<String, MyObject> map = new HashMap<String, MyObject>(); 

     for (MyObject current : objects) { 
     String key = String.format("%s:%s", current.gender, current.state); 
      MyObject aggregated = map.get(key); 
      if (aggregated == null) { 
       aggregated = new MyObject(); 
       aggregated.setGender(current.getGender()); 
       aggregated.setState(current.state); 
       map.put(key, aggregated); 
      } 
      aggregated.nombre+=1; 
      aggregated.setQuantity(aggregated.getQuantity() + current.getQuantity()); 
      aggregated.setSalary((aggregated.getSalary() + current.getSalary())); 

     } 
      for(MyObject c : map.values()){ 
      c.setSalary(c.getSalary()/c.nombre); 

     } 

     return map.values(); 
    } 

我已经添加的属性NOMBRE为myObject。

2

我看到:agregation后

内容这里至少有四个问题:

  1. 如果当前的薪水为0,则无论如何都要计算它,如果它是第一次删除0 - ouch。
  2. ​​是一个int并假设getSalary()也返回int您将得到截断/舍入问题,因为当所有操作数都是整数时,1/2 = 0。
  3. 您可能要计算之后的平均值,总计所有工资,而不是每次迭代。
  4. 您似乎根据性别和地位进行了聚合,但您只有一个计数器(​​)。你会想每个聚合都有一个计数器。
+0

你确实需要我的第4点 –

+0

我编辑了我的文章,所以你可以更好地理解。 –

+0

@hamzaspecter如果第四点是你所需要的,那么继续并实施它。我相信你知道如何跟踪多项指标。至少还要实现第三点。 – Thomas