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

Java 通过比较日期从列表中删除项目,java,list,date,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 SimpleDateFo

我有以下方法:

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;
}
public List compareDate(列表列表、字符串from、字符串to){
字符串dateFromLog;
Date fromDate=null;
日期toDate=null;
SimpleDataFormat sdfToDateTime=新SimpleDataFormat(
“yyyyMMdd HH:mm:ss”);
SimpleDataFormat sdfToDate=新的SimpleDataFormat(“yyyyMMdd”);
试一试{
fromDate=sdfToDate.parse(from);
toDate=sdfToDate.parse(to);
}捕获(解析异常){
e、 printStackTrace();
}
对于(int i=0;i
我有一些问题,如果在尝试捕捉块。我想删除此列表中的每个条目,其中logDate在fromDate之前,toDate之后。不幸的是,它删除了一些列表条目,但不是全部

我做错了什么


非常感谢

迭代
集合时
,只能通过以下方式删除元素。否则,可能会发生未定义的行为

for (Iterator<List<String>> it = lists.iterator(); it.hasNext();) {
    List<String> aList = it.next();
    if (mustRemove(aList)) {
        it.remove();
    }
}
for(Iterator it=lists.Iterator();it.hasNext();){
List aList=it.next();
如果(必须移除(列表)){
it.remove();
}
}
来自Java教程中的:

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


另外,如果您能够使用第三方库,那么可以使用Apache Commons的集合以及
谓词
,该谓词将从
列表中删除不需要的元素

,您不应该使用索引对列表进行前向迭代并删除该循环中的元素,因为这样可以跳过元素

问题如下:

假设索引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--) {
  ...
}