2016-03-04 54 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