我有以下方法:
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之后。不幸的是,它删除了一些列表但不是全部。
我在这里做错了什么?
非常感谢提前!
答案 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--) {
...
}