通过比较日期从列表中删除项目

时间:2014-03-12 11:42:26

标签: java list date

我有以下方法:

public List<List<String>> compareDate(List<List<String>> lists,String from, String to) {

    String dateFromLog;
    Date fromDate = null;
    Date toDate = null;

    SimpleDateFormat sdfToDateTime = new SimpleDateFormat(
            "yyyyMMdd HH:mm:ss");
    SimpleDateFormat sdfToDate = new SimpleDateFormat("yyyyMMdd");

    try {
        fromDate = sdfToDate.parse(from);
        toDate = sdfToDate.parse(to);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    for (int i = 0; i < lists.size(); i++) {
        dateFromLog = lists.get(i).get(0);
        try {
            Date logDate = sdfToDateTime.parse(dateFromLog);

            if (fromDate.before(logDate)) {
                lists.remove(i);
            } else if (toDate.after(logDate)) {
                lists.remove(i);
            }

        } catch (ParseException ex2) {
            ex2.printStackTrace();
        }
    }
    return lists;
}

我在try catch块中遇到了一些麻烦。我想删除此列表中的每个条目,其中logDate位于fromDate之前和toDate之后。不幸的是,它删除了一些列表但不是全部。

我在这里做错了什么?

非常感谢提前!

2 个答案:

答案 0 :(得分:3)

在迭代Collection时,元素删除只能通过Iterator.remove 完成。否则,可能会发生未定义的行为。

for (Iterator<List<String>> it = lists.iterator(); it.hasNext();) {
    List<String> aList = it.next();
    if (mustRemove(aList)) {
        it.remove();
    }
}

来自Java Tutorials中的The Collection Interface

  

请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定。

此外,如果您可以使用第三方库,则可以使用Apache Commons的集合CollectionUtils.filter()以及Predicate来删除List中不需要的元素}。

答案 1 :(得分:3)

你不应该使用索引在列表上转发迭代并删除该循环中的元素,因为这样可以跳过元素。

问题如下:

假设指数2,3和4处的元素匹配。现在你在i = 2并删除元素2。 移动所有后续元素,使元素3现在位于索引2,元素4位于索引3.在下一次迭代中,i将增加到3,因此您将检查元素4,从而有效地跳过元素3。

要修复它向后迭代或使用迭代器。

使用迭代器的首选方法:

for (Iteratory<List<String> itr = lists.iteator(); itr.hasNext(); ) {
  List<String> elementList = itr.next();
  ...

  if( ... ) {
    itr.remove();
  }
}

相反的方式(不是首选):

for (int i = lists.size() - 1; i >= 0 ; i--) {
  ...
}