Java 如何遍历对象的ArrayList

Java 如何遍历对象的ArrayList,java,object,arraylist,Java,Object,Arraylist,我有一个定制用户的ArrayList。列表已按经理排序。我的目标是通过经理查看列表,并根据每个用户的过期日期将其添加到电子邮件正文中 用户基本上是从数据库中这样构建的。所有必要的访问器/变异器都存在: id|fName|lName|...|manager 检查用户并在用户到期时通知经理: To: Manager Expiring in 10 days <User> <User> Expiring in 30 days <User> To:Manager

我有一个定制
用户的
ArrayList
列表已按
经理排序。
我的目标是通过
经理查看列表,并根据每个用户的过期日期将其添加到电子邮件正文中

用户
基本上是从数据库中这样构建的。所有必要的访问器/变异器都存在:

id|fName|lName|...|manager
检查用户并在用户到期时通知经理:

To: Manager

Expiring in 10 days
<User>
<User>
Expiring in 30 days
<User>
To:Manager
10天后到期
30天后到期

StringBuilder body=new StringBuilder();
ArrayList承包商;
Date today=cal.getTime();
...
if(contactors!=null&&contactors.size()>0){
对于(int i=0;icontractors.size()){
//采取措施避免超出边界,并仍然访问列表中的最后一项
}否则{
if(contactors.get(i+1).getManager()!=null){
if(manager.equals(contactors.get(i+1.getManager())){
如果(今天比较(contractor.getExpiration()){
//构建电子邮件正文
}
}
}
sendmail(manager,body.toString());
}否则{
//新经理
body.equals(“”;//为下次运行重置电子邮件
}
}
在发送电子邮件后,我想根据
管理器转移到下一组用户。
我的问题是,我对管理器遍历数组,然后每次为每个新
管理器重置的逻辑有问题。
我想我需要另一个
for loop

最好的方法是什么?谢谢

编辑


当以这种方式实现时:

迭代
用户列表
,并将他们添加到由经理键入的
映射中,每个经理有
员工集

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) {
            // ...  
        }
    }
}
if(contactors!=null&&contactors.size()>0){
Map Map=newhashmap();
用户(承包商:承包商){
字符串管理器=contractor.getManager();
if(manager==null){
manager=contractor.getName();
}
设置employees=map.get(经理);
if(employees==null){
employees=newhashset();
map.put(经理、员工);
}
员工。添加(承包商);
}//现在您可以迭代密钥集,然后每个经理的员工
for(字符串管理器:map.keySet()){
设置employees=map.get(经理);
针对用户(u:员工){
// ...  
}
}
}
您应该在contractors上进行“foreach”循环,了解更多信息


另一个例子

我会这样做:

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());
}

如果已经对它们进行了排序,则可以采用这种方法(我使用“ManagerObject”表示用户的返回类型。getManager()-替换为实际的类名):


如果由于某种原因,对Users.getManager()的调用在计算上非常昂贵,则可以重新调整,以便仅在值发生变化时设置currentManager

您可以添加如何设置/更改
manager
?为什么
contactors.get(i+1)
?这永远不会到达
contactors.get(0)
-这有什么原因吗?我将初始承包商设置为这样的
承包商=承包商(i);
很抱歉我忘了这一点现在你真的把我弄糊涂了。为什么不直接调用map.get without map.containsKey?@laune最初,我打算使用
else
.Edited。你为什么要
发送电子邮件(body.toString())
currentManager!=null
中?
currentManager==null
在循环的第一次迭代开始时为true,这与在该点上没有任何“当前”管理器(以及根据该变量的初始化)的事实相一致。您不希望为之前处理过的零承包商发送电子邮件。在第一次迭代后,
currentManager
永远不会
null
@John_Bollinger如果采用这种方式,系统会为每个用户发送一封电子邮件,而不是为每个经理向每个主体添加适当的用户并发送一封sin向所有用户发送电子邮件。然后resetting@BarryDale2014,并非如此。仅当(!contractorManager.equals(currentManager))
时才会发送电子邮件-,仅当刚从列表中获取的承包商的经理与之前的经理不同时才会发生这种情况--最后是最后一组。这确实取决于经理排序的列表的正确性,但你说它已经正确了。
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());
}
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
}