【问题标题】:Modify previous item in iteration修改迭代中的前一项
【发布时间】:2013-09-02 15:30:33
【问题描述】:

在我的 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 知识让我有点退缩了。

为了知道“空闲时间”约会何时结束,我必须知道下一个“真正”约会何时开始。但是直到迭代器的下一个周期,我才能获得该信息,此时“空闲时间”约会不再是上下文。

我该如何解决这个问题?

【问题讨论】:

    标签: java android iterator


    【解决方案1】:

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

    或者,如果您使用的是ListIterator,您可以使用previous() 方法返回到上一项。不过,这完全取决于您发现什么更简单——我的猜测是使用显式索引更容易理解代码。 (这意味着您也可以删除 if (count &gt; 0) 部分...)

    【讨论】:

    • 我在想我使用迭代器太聪明了!实际上,我首先想到的是计数器。
    • 感谢您提供的额外信息。我发现使用迭代器的好处是我能够使用iter.add() 在当前位置插入新行。如果我只是使用计数器/索引方法,是否有一个很好的等价物?
    • @Teifi:您只需将List.add 与索引一起使用。
    • 啊,我没有看到超载。我假设这会自动将所有后续条目推上一个索引?
    • @Teifi:是的。我希望ArrayList 返回的ListIterator 实现最终会像这样有效地调用add :)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      相关资源
      最近更新 更多