【问题标题】:Result is no longer the same while aggregating data聚合数据时结果不再相同
【发布时间】: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


【解决方案1】:

在您的第一个片段中,您正在做一些事情来将current 添加到aggregated。在您的第二个中,您仅引用 aggregated 所以可能不对。

类似:

        }
        aggregated.setQuantity(aggregated.getQuantity() + current.getQuantity());
        aggregated.setSalary(aggregated.getSalary() + current.getSalary());

应该会更好。

【讨论】:

  • 不,在我的第二个代码中,它添加了所有字段的内容,除了我希望只使用具有相同性别和相同状态的字段
  • @hamzaspecter - 您的第二个片段不聚合,它将aggregate.quantityaggregate.salary 留在0。当你应该使用+current.getQuantity()时,你说+aggregated.getQuantity()
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2018-12-12
  • 2023-01-26
  • 2019-07-09
相关资源
最近更新 更多