Java无外部库创建数据类时间范围属性及CSV数据筛选问题
问题1:不需要使用HashMap存储起止日期
直接在你的Data类里新增两个独立字段分别存开始日期、结束日期即可,HashMap反而会增加取值的复杂度,没有必要。
问题2:优先用JDK内置日期类处理,也可保留格式化后的字符串
JDK 8及以上自带的java.time.LocalDate属于标准库,不属于你说的外部库,用它做日期比较逻辑更简单不容易出错。如果你的练习要求连标准库的日期类都不能用,只要把日期统一补全为YYYY/MM/DD格式(比如把2021/6/1补为2021/06/01),直接用字符串的字典序比较也能得到正确的日期先后结果。
具体实现参考
1. 修改后的Data类(用LocalDate版本,无外部依赖)
import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class Data { String area; LocalDate startDate; LocalDate endDate; // 定义固定的日期格式化器,适配你用的yyyy/M/d格式 private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy/M/d"); public Data(String area, String timeStr) { this.area = area; // 拆分时间范围字符串,分隔符和你示例的输入格式对齐 String[] timeParts = timeStr.split(" - "); this.startDate = LocalDate.parse(timeParts[0], FORMATTER); this.endDate = LocalDate.parse(timeParts[1], FORMATTER); } // 匹配方法:判断当前数据是否符合用户输入的查询条件 public boolean isMatch(String inputArea, LocalDate inputStart, LocalDate inputEnd) { // 先匹配区域一致 if (!this.area.equals(inputArea)) { return false; } // 当前逻辑为:数据的时间范围完全落在用户输入的时间范围内 // 如果需要判断两个时间范围有交集,替换为:return !this.startDate.isAfter(inputEnd) && !this.endDate.isBefore(inputStart); return !this.startDate.isBefore(inputStart) && !this.endDate.isAfter(inputEnd); } }
2. 完全不用日期类的纯字符串版本
public class Data { String area; // 统一存储为yyyy/MM/dd格式的字符串,保证字典序和日期序完全一致 String startDateStr; String endDateStr; public Data(String area, String timeStr) { this.area = area; String[] timeParts = timeStr.split(" - "); this.startDateStr = formatDateStr(timeParts[0]); this.endDateStr = formatDateStr(timeParts[1]); } // 工具方法:把2021/6/1转为2021/06/01的标准格式 private String formatDateStr(String origin) { String[] parts = origin.split("/"); String year = parts[0]; String month = parts[1].length() == 1 ? "0" + parts[1] : parts[1]; String day = parts[2].length() == 1 ? "0" + parts[2] : parts[2]; return year + "/" + month + "/" + day; } // 匹配方法 public boolean isMatch(String inputArea, String inputStartStr, String inputEndStr) { if (!this.area.equals(inputArea)) { return false; } String formatInputStart = formatDateStr(inputStartStr); String formatInputEnd = formatDateStr(inputEndStr); // 完全包含逻辑:数据开始 >= 查询开始,数据结束 <= 查询结束 return startDateStr.compareTo(formatInputStart) >= 0 && endDateStr.compareTo(formatInputEnd) <= 0; } }
3. 读取CSV和查询逻辑补充
你原来的读取代码需要把生成的Data对象存入列表,方便后续查询:
import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Scanner; // 读取CSV逻辑 List<Data> dataList = new ArrayList<>(); File inputFile = new File("covid-data.csv"); // 简化异常处理,练习场景可直接使用 try (Scanner sc = new Scanner(inputFile)) { // 如果CSV有表头,先跳过第一行 if (sc.hasNextLine()) { sc.nextLine(); } while (sc.hasNextLine()) { String str = sc.nextLine(); String[] tokens = str.split(","); // 注意:如果CSV字段包含逗号,split会出错,练习无特殊格式可正常使用 Data d = new Data(tokens[2], tokens[3]); dataList.add(d); } } catch (Exception e) { e.printStackTrace(); } // 查询示例(以LocalDate版本为例) Scanner inputScanner = new Scanner(System.in); System.out.println("请输入查询区域:"); String inputArea = inputScanner.nextLine(); System.out.println("请输入查询时间范围(格式如2021/6/1 - 2021/6/30):"); String inputTimeRange = inputScanner.nextLine(); String[] inputTimeParts = inputTimeRange.split(" - "); LocalDate inputStart = LocalDate.parse(inputTimeParts[0], Data.FORMATTER); LocalDate inputEnd = LocalDate.parse(inputTimeParts[1], Data.FORMATTER); // 遍历匹配输出结果 for (Data data : dataList) { if (data.isMatch(inputArea, inputStart, inputEnd)) { // 可自行补充输出其他CSV字段 System.out.println("区域:" + data.area + ",时间范围:" + data.startDate + " 至 " + data.endDate); } }
内容的提问来源于stack exchange,提问作者treepl
相关产品推荐
相关产品推荐

