在迭代中修改上一个项目

时间:2013-09-02 15:30:34

标签: java android iterator

在我的Android应用程序中,我有一个Appointment对象列表,其中包含与约会相关的信息。然后,ListView将填充这些约会的选择,按时间排序。

我已为此列表视图编写了自己的自定义适配器,以便能够在约会之间插入“空闲时间”约会。

到目前为止,这是我的代码:

ArrayList<Appointment> appointments = new ArrayList<Appointment>();
// populate arraylist here
ListIterator<Appointment> iter = appointments.listIterator();
DateTime lastEndTime = new DateTime();
int count = 0;
while (iter.hasNext()){
    Appointment appt = iter.next();
    lastEndTime = appt.endDateTime;
    // Skips first iteration
    if (count > 0)
    {
        if (lastEndTime.isAfter(appt.startDateTime))
        {
            if (iter.hasNext())
            {
                Appointment freeAppt = new Appointment();
                freeAppt.isFreeTime = true;
                freeAppt.subject = "Free slot";
                freeAppt.startDateTime = lastEndTime;
                freeAppt.endDateTime = lastEndTime.minusMinutes(-60); // Currently just set to 60 minutes until I solve the problem
                iter.add(freeAppt);
            }
        }
    }
    count++;
}
DiaryAdapter adapter = new DiaryAdapter(this, R.layout.appointment_info, appointments);

我遇到的问题是逻辑问题。我一直绞尽脑汁试图找到一个解决方案,但似乎我缺乏java知识让我回到这里。

为了知道“空闲时间”约会何时结束,我必须知道下一次“真正的”约会何时开始。但是在迭代器的下一个周期之前我无法获得这些信息,此时“空闲时间”的约会不再是在上下文中。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

使用索引而不是迭代器迭代,并使用appointments.get()检索元素。然后,您可以在早期索引中对列表进行更改。您只需要做一些簿记,以使索引与任何列表更改保持同步。

答案 1 :(得分:3)

在这种特殊情况下,最简单的选项可能根本不使用迭代器。您已经绑定了List(而不是任何Iterable),因此您可以保留一个计数器并使用get()

或者,假设您使用ListIterator,则可以使用previous()方法返回上一项。这一切都是你发现更简单的问题 - 我的猜测是使用显式索引理解代码会更容易。 (这意味着您也可以删除if (count > 0)部分...)