Java 计算平均值,同时聚合数据

Java 计算平均值,同时聚合数据,java,Java,我有以下功能。它允许我在我的对象的性别和状态维度内聚合数据: MyObject structure is: public class MyObject { String gender; String state; int quantity; int Salary;} 弃权后的内容: element : 1 M 40 1200 element : 1 F 35 2000 element : 1 M 20 200 element : 1 M

我有以下功能。它允许我在我的对象的性别和状态维度内聚合数据:

 MyObject structure is: 

public class MyObject { 
 String gender; 
 String state; 
  int quantity; 
  int Salary;}
弃权后的内容:

 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
但我期待着:

弃权后的内容:
元素:1米140 566

元素:1 F 70 2000

我在这里看到至少四个问题:

  • 如果当前的工资是0,你无论如何都要计算它,如果它是你第一次删除0-哎哟
  • nombre
    是一个
    int
    并且假设
    getSalary()
    也返回一个
    int
    当所有操作数都是整数时,会出现截断/舍入问题,因为1/2=0
  • 您可能希望在将所有工资相加后计算平均值,而不是每次迭代
  • 您似乎根据性别和身份进行聚合,但您只有一个计数器(
    nombre
    )。您需要为每个聚合设置一个计数器
  • 私有静态集合聚合(列出对象){
    Map Map=newhashmap();
    用于(MyObject当前:对象){
    String key=String.format(“%s:%s”,current.gender,current.state);
    MyObject聚合=map.get(键);
    如果(聚合==null){
    聚合=新的MyObject();
    聚合的.setGender(current.getGender());
    聚合.setState(当前.state);
    map.put(键,聚合);
    }
    聚合。nombre+=1;
    aggregated.setQuantity(aggregated.getQuantity()+current.getQuantity());
    aggregated.setSalary((aggregated.getSalary()+current.getSalary());
    }
    对于(MyObject c:map.values()){
    c、 setSalary(c.getSalary()/c.nombre);
    }
    返回map.values();
    }
    

    我已经为MyObject添加了一个属性nombre。

    如果出现问题,则需要提示一些问题;)-说真的,说得更具体一点:怎么了?你有什么错误吗?不想要的输出(如果是这样,那么您期望得到什么?您得到什么?
    current.getSalary()
    返回什么?@Thomas我没有得到想要的输出。正如你所说的,我想在所有工资相加后计算平均值,同时getSalary()返回一个int值。我编辑了我的帖子,这样你就可以更好地理解了。@hamzaspecter如果第四点是你需要的,那么继续执行它。我相信你知道如何记录多次计数。至少也要实施第三点。我需要实施第四点,然后第三点会直接出现。我不知道如何处理每个聚合的多个计数器。如果你能给我一点启发,我将不胜感激idea@hamzaspecter好的,有多种方法,我将命名为2:1)为包含计数的聚合创建一个包装器,并在映射中使用该包装器。最后,从包装器中提取聚合并将其放入结果列表中。2) 使用具有相同键和
    整数的第二个映射。要增加它,您需要提取值(如果没有,则创建一个),添加1并再次将其放入映射中。
    
     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` 
    
      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();
        }