如何基于已有ArrayList筛选匹配日期的事件,生成新的ArrayList
问题错误点
你之前的代码主要有两个问题:
- 循环匹配成功后,你往filtered列表里插入了
null值,而不是匹配到的事件内容,同时不需要指定插入位置i,filtered是独立的新列表,索引和原allEvents没有对应关系,直接追加元素即可 - 单独用
allEvents.contains(extractDate)的逻辑不成立,因为allEvents里存储的是完整的事件字符串,不是单独的日期字段,直接判断列表是否包含日期字符串必然返回false
修复后的实现代码
普通for循环写法(和你原有写法兼容,改起来最简单)
for (int i = 0; i < allEvents.size(); i++){ String currentEvent = allEvents.get(i); // 匹配事件字符串中是否包含提取出来的目标日期 if (currentEvent.contains(extractDate)){ // 直接把匹配到的事件加入结果列表 filtered.add(currentEvent); } }
Java 8+ Stream流式写法(更简洁)
如果你用的是Java 8及以上版本,可以用流式API一行完成过滤:
List<String> filtered = allEvents.stream() .filter(event -> event.contains(extractDate)) .toList();
优化建议
你现在用substring(0,10)提取日期的逻辑依赖所有事件的前10位固定是日期格式,如果后续事件格式有变动很容易出错,更稳妥的方式是按空格切分事件字符串取第一个元素作为事件日期:
// 提取当前事件的日期部分 String eventDate = currentEvent.split(" ")[0]; // 再和目标日期比对 if (eventDate.equals(extractDate)) { filtered.add(currentEvent); }
这种写法可以避免事件后半段内容刚好出现日期字符串导致的误匹配问题。
内容的提问来源于stack exchange,提问作者Panda
相关产品推荐
相关产品推荐

