要映射的单键多个帐户

时间:2014-06-11 10:54:41

标签: java list collections map hashmap

我的地图被声明为private Map accountByReport; 在将相应的部门帐户添加到密钥之前,我使用以下循环来检查reportID是否在地图中。我的循环是否正确,此实例中的类型声明应该是什么?如何捕获异常?

 for(Entity entity : entities) {
  if(accountsByReport.containsKey(entity.getReportID())) {
      ((List<String>)accountsByReport.get(entity.getReportID())).add(entity.getDepAccount());
  } else {
      accountsByReport.put(entity.getReportID(), new ArrayList<String>().add(entity.getDepAccount()));
  }
}

3 个答案:

答案 0 :(得分:1)

看来你正在向else中的地图添加一个布尔值(返回ok .add())。 我会用这种方式:

  for(Entity entity : entities) {
        if(accountsByReport.containsKey(entity.getReportID())) {
            ((List<String>)accountsByReport.get(entity.getReportID())).add(entity.getDepAccount());
        } else {
            List<String> list = new ArrayList<String>();
            list.add(entity.getDepAccount());
            accountsByReport.put(entity.getReportID(), list);
        }
    }

您没有粘贴地图定义,但您应该使用输入参数 - 即Map<String, List<String>> accountsByReport = new HashMap<String, List<String>>();,这样您就不需要在.get之后进行投射

事实上你粘贴了它。 使用:private Map<String, List> accountByReport;

请参阅http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

答案 1 :(得分:1)

到目前为止您的代码是正确的,但您的Map应声明类型

应根据reportID的类型

声明地图
//if String
private Map<String, List<String>> accountByReport;
//if int
private Map<Integer, List<String>> accountByReport;
//so on

答案 2 :(得分:0)

你的循环基本上是正确的。您可以做的唯一改进是执行单个get并存储结果,而不是同时执行contains和get。你也应该使用泛型,这样你就不需要演员......

   List<String> list = accountsByReport.get(entity.getReportID())

        if(list != null) {
            list.add(entity.getDepAccount());
        } else {
            accountsByReport.put(entity.getReportID(), new ArrayList<String>().add(entity.getDepAccount()));
        }