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
我在这里看到至少四个问题:
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();
}