You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 05:12:02