Flutter中如何移除列表内指定起止时间范围的字符串元素
Dart中过滤指定时间区间内元素的实现方案
现有代码问题梳理
- 仅匹配了和
startTime完全相等的元素,没有覆盖12:00 AM到2:00 AM的全区间 - 正序遍历列表时直接删除元素会导致后续元素下标前移,出现漏判的情况
- 12小时制的时间字符串无法直接比较大小,需要先转换为可比较的数值格式
实现步骤
- 先编写辅助方法将12小时制时间字符串转换为当日零点后的总分钟数,方便大小比较
- 提前把
startTime和endTime转换为对应的总分钟数值 - 过滤列表时优先使用
where方法,如果必须用for循环则选择倒序遍历避免漏判
完整可运行代码
void main() { late List<String> times; times = [ "12:00 AM", "12:15 AM", "12:30 AM", "12:45 AM", "1:00 AM", "1:15 AM", "1:30 AM", "1:45 AM", "2:00 AM", "2:30 AM", "3:00 AM", ]; String startTime = "12:00 AM"; String endTime = "2:00 AM"; // 辅助方法:把12小时制时间转成当日总分钟数 int timeToMinutes(String timeStr) { List<String> parts = timeStr.split(' '); List<String> timeParts = parts[0].split(':'); int hour = int.parse(timeParts[0]); int minute = int.parse(timeParts[1]); String period = parts[1]; if (period == 'AM') { hour = hour == 12 ? 0 : hour; } else { hour = hour == 12 ? 12 : hour + 12; } return hour * 60 + minute; } int startMin = timeToMinutes(startTime); int endMin = timeToMinutes(endTime); // 方法1:简洁写法,直接用where过滤 List<String> filteredTimes = times.where((time) { int currentMin = timeToMinutes(time); // 保留不在[startMin, endMin]区间内的时间 return currentMin < startMin || currentMin > endMin; }).toList(); print(filteredTimes); // 输出: [2:30 AM, 3:00 AM] // 方法2:如果必须使用for循环实现,用倒序遍历避免下标问题 for (int i = times.length - 1; i >= 0; i--) { int currentMin = timeToMinutes(times[i]); if (currentMin >= startMin && currentMin <= endMin) { times.removeAt(i); } } print(times); // 输出: [2:30 AM, 3:00 AM] }
运行结果
两种实现方式最终都会输出目标结果:["2:30 AM", "3:00 AM"]
内容的提问来源于stack exchange,提问作者Mohammed Nabil
相关产品推荐
相关产品推荐

