【问题标题】:How to traverse an ArrayList of Objects如何遍历对象的 ArrayList
【发布时间】:2014-12-02 15:45:09
【问题描述】:

我有一个自定义Users.ArrayList 该列表已按manager.排序我的目标是按manager 浏览列表,并根据每个用户的到期时间将每个用户添加到电子邮件正文中日期。

User 基本上是这样从数据库中构建的。所有必要的访问器/修改器都存在:

id|fName|lName|...|manager

查看用户并在用户到期时通知管理员:

To: Manager

Expiring in 10 days
<User>
<User>
Expiring in 30 days
<User>

StringBuilder body = new StringBuilder();
ArrayList<Users> contractors;
Date today = cal.getTime();
...
if(contractors != null && contractors.size() > 0){

 for(int i = 0; i < contractors.size(); i++){

  if(i+1 > contractors.size()){
   //do something to avoid outOfBounds and still access last item in the list
  }else{

   if (contractors.get(i+1).getManager() != null){ 
    if(manager.equals(contractors.get(i+1).getManager())){
     if(today.compareTo(contractor.getExpiration()){
       //build body of email
     }
    }
  }
  sendEmail(manager, body.toString());
 }else{
  //new manager
  body.equals(""); // reset email for next run
}
}

发送电子邮件后,我想转移到基于manager. 的下一组用户我的问题是我遇到了经理遍历数组然后每次为每个新@ 重置的逻辑问题987654330@我想我需要另一个for loop

最好的方法是什么?谢谢

编辑

当以这种方式实现时:

【问题讨论】:

  • 你能添加你如何设置/更改mangager吗?
  • 为什么是contractors.get(i+1)?这永远不会到达contractors.get(0) - 这是有原因的吗?
  • 我正在像这样设置初始承包商 contractor = contractors(i); 抱歉我漏掉了
  • 现在你真的把我弄糊涂了。

标签: java object arraylist


【解决方案1】:

我会这样做:

if (contractors != null) {
    String currentManager = null;

    for (User contractor : contractors) {
        String contractorManager = contractor.getManager();

        if (!contractorManager.equals(currentManager) {
            // a new manager
            if (currentManager != null) {
                sendEmail(body.toString());
                body.setLength(0);
            }
            currentManager = contractorManager;
        }
        //build body of email ...
    }

    // send the email for the last manager
    sendEmail(body.toString());
}

【讨论】:

  • 你为什么在currentManager != null中做sendEmail(body.toString());
  • currentManager == null 在循环的第一次迭代开始时为真,这与当时没有任何“当前”管理器(并且根据该变量的初始化)的事实一致。您不想为到目前为止处理的零承包商发送电子邮件。在第一次迭代之后,currentManager 永远不会是 null
  • @John_Bollinger 如果以这种方式实现,系统会为每个用户发送一封电子邮件,无论如何。而不是将适当的用户添加到每个经理的每个正文中,并与所有用户一起发送一封电子邮件。然后重置
  • @BarryDale2014,不是这样。仅发送电子邮件 if (!contractorManager.equals(currentManager)) - 只有当刚刚从列表中获得的承包商的经理与前一个不同时才会发生这种情况 - 最后是最后一组。这确实取决于它对经理排序的列表的正确性,但你说它已经是。
【解决方案2】:

迭代Users 的列表并将它们添加到由经理键入的Map 中,每个经理的员工数量为Set。类似的,

if (contractors != null && contractors.size() > 0) {
    Map<String, Set<Users>> map = new HashMap<>();
    for (Users contractor : contractors) {
        String manager = contractor.getManager();
        if (manager == null) {
            manager = contractor.getName();
        }
        Set<Users> employees = map.get(manager);
        if (employees == null) {
            employees = new HashSet<>();
            map.put(manager, employees);
        }
        employees.add(contractor);
    } // now you can iterate the keySet and then each manager's employees like
    for (String manager : map.keySet()) {
        Set<Users> employees = map.get(manager);
        for (Users u : employees) {
            // ...  
        }
    }
}

【讨论】:

  • 为什么不直接调用 map.get 而不使用 map.containsKey?
  • @laune 最初,我打算使用else。已编辑。
【解决方案3】:

你应该对承包商进行“foreach”循环,更多信息here

另一个例子here

【讨论】:

    【解决方案4】:

    如果它们已经排序,您可以采用这种方法(我使用“ManagerObject”来表示 Users.getManager() 的返回类型 - 替换为实际的类名):

    StringBuilder body = new StringBuilder();
    ManagerObject currentManager = null;
    for (Users contractor : contractors) {
      if (currentManager != null && !(contractor.getManager().equals(currentManager)) {
        sendEmail(body.toString());
        body.equals("");
      }
      currentManager = contractor.getManager();
      // Add stuff to the body for this contractor
    }
    

    如果由于某种原因对 Users.getManager() 的调用在计算上很昂贵,则可以将其重新调整为仅在值更改时设置 currentManager

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-16
      • 2015-07-22
      • 2019-04-19
      • 2018-10-07
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 2017-08-12
      相关资源
      最近更新 更多