【发布时间】:2016-03-03 14:27:19
【问题描述】:
我一直在使用以下函数来聚合数据:
private 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.gender = current.gender;
aggregated.state = current.state;
map.put(key, aggregated);
}
aggregated.quantity += current.quantity;
aggregated.salary += current.salary;
}
return map.values();
}
MyObject 结构:
public class MyObject {
private String gender;
private String state;
private int quantity;
private int Salary;
//getters & setters}
但因为我必须将 MyObject 属性声明为 Private,所以我将其更改为以下内容:
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);
}
int quantity=0,salary=0;
quantity=quantity+aggregated.getQuantity();
salary= salary+aggregated.getSalary();
aggregated.setQuantity(quantity);
aggregated.setSalary(salary);
}
return map.values();
}
所以它不再给我想要的结果。
【问题讨论】:
-
“期望的结果”是什么?
-
@OldCurmudgeon 我没有使用 equals() 和 hashCode()
-
@hamzaspecter - 你可能不会,但
HashMap会。无论如何,这是一个愚蠢的评论,因为您的密钥是Strings。将其删除。 -
提示:请阅读一些关于 OO 设计的内容。你正在做完全错误的事情。您不应使用 getter 来检索值、更改该值并使用 setter 将其写回。相反 - 在你的类上放置允许你做你需要的事情的方法。例如,您可以添加一个方法
aggregateWith(MyObject otherGuy)... 或者更好的是,您可以创建一个“合并”两个 MyObjects 的方法;变成一个新的。 -
附注:您现在所经历的正是您将 StackOverflow 用作“代码生成器”时发生的情况。在您的第一个问题中……您要求解决方案;你得到了没有任何解释的代码(这实际上非常令人惊讶,在这里并不经常发生)。但是,当然,你是一个初学者,现在你正在努力解决下一个问题。所以,我要说的是:没有弯路。你必须学习基本的东西;并且寻求解决方案并不是学习的有效方式。比如:学习射击的时候;简单地要求上膛的武器不是一个好主意。
标签: java arrays dictionary