在Java程序设计中,月度降雨量统计与分析是常见的数据处理场景,核心是通过合理的数据结构和逻辑实现,完成对原始降雨量数据的加工与结果输出。整个过程可以分为数据准备、核心统计、结果输出三个主要环节,下面逐步展开讲解。

一、数据准备与存储
首先需要明确月度降雨量的数据形式,通常原始数据会包含日期和对应降雨量数值,我们可以先使用数组存储单月的降雨量数据,假设统计的是某自然月31天的数据,可以用double类型数组存储每日降雨量。
如果数据来自外部文件,还需要实现文件读取逻辑,这里先给出基础的数据定义示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class RainfallAnalysis {
// 存储单月31天的降雨量数据,单位:毫米
private double[] dailyRainfall = new double[31];
// 从CSV文件读取降雨量数据,文件格式为:日期,降雨量
public void loadDataFromFile(String filePath) throws IOException {
List<Double> tempList = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader(filePath));
String line;
// 跳过表头
br.readLine();
while ((line = br.readLine()) != null) {
String[] parts = line.split(",");
if (parts.length == 2) {
try {
double rainfall = Double.parseDouble(parts[1]);
tempList.add(rainfall);
} catch (NumberFormatException e) {
System.out.println("数据格式错误,跳过该行:" + line);
}
}
}
br.close();
// 将数据转移到数组中,不足31天的补0
for (int i = 0; i < 31; i++) {
if (i < tempList.size()) {
dailyRainfall[i] = tempList.get(i);
} else {
dailyRainfall[i] = 0.0;
}
}
}
}
二、核心统计功能实现
完成数据加载后,就可以实现各类统计逻辑,常见的统计需求包括总降雨量、平均降雨量、最高/最低降雨量及对应日期、降雨天数统计等。
1. 总降雨量与平均降雨量计算
总降雨量是数组所有元素的和,平均降雨量则是总降雨量除以当月实际有记录的天数,实现代码如下:
// 计算总降雨量
public double getTotalRainfall() {
double total = 0.0;
for (double rainfall : dailyRainfall) {
total += rainfall;
}
return total;
}
// 计算平均降雨量,排除无降雨的0值天数
public double getAverageRainfall() {
double total = 0.0;
int validDayCount = 0;
for (double rainfall : dailyRainfall) {
if (rainfall > 0) {
total += rainfall;
validDayCount++;
}
}
if (validDayCount == 0) {
return 0.0;
}
return total / validDayCount;
}
2. 最高与最低降雨量查询
遍历数组找到最大值和最小值,同时记录对应的日期索引,实现代码如下:
// 获取最高降雨量及对应日期(日期从1开始)
public String getMaxRainfallInfo() {
double max = dailyRainfall[0];
int maxDay = 1;
for (int i = 1; i < dailyRainfall.length; i++) {
if (dailyRainfall[i] > max) {
max = dailyRainfall[i];
maxDay = i + 1;
}
}
return "最高降雨量:" + max + "毫米,日期:当月第" + maxDay + "天";
}
// 获取最低降雨量及对应日期(排除0值)
public String getMinRainfallInfo() {
double min = -1;
int minDay = -1;
for (int i = 0; i < dailyRainfall.length; i++) {
double current = dailyRainfall[i];
if (current > 0) {
if (min == -1 || current < min) {
min = current;
minDay = i + 1;
}
}
}
if (min == -1) {
return "当月无有效降雨记录";
}
return "最低降雨量:" + min + "毫米,日期:当月第" + minDay + "天";
}
3. 降雨天数统计
统计降雨量大于0的天数即可,代码如下:
// 统计降雨天数(降雨量>0的天数)
public int getRainyDayCount() {
int count = 0;
for (double rainfall : dailyRainfall) {
if (rainfall > 0) {
count++;
}
}
return count;
}
三、结果输出与扩展
完成统计后,可以将结果输出到控制台或者写入到结果文件中,以下是输出到控制台的示例:
public void printAnalysisResult() {
System.out.println("===== 月度降雨量分析结果 =====");
System.out.println("总降雨量:" + getTotalRainfall() + "毫米");
System.out.println("平均降雨量:" + getAverageRainfall() + "毫米");
System.out.println(getMaxRainfallInfo());
System.out.println(getMinRainfallInfo());
System.out.println("降雨天数:" + getRainyDayCount() + "天");
}
public static void main(String[] args) {
RainfallAnalysis analysis = new RainfallAnalysis();
try {
// 假设数据文件放在项目根目录的rainfall.csv
analysis.loadDataFromFile("rainfall.csv");
analysis.printAnalysisResult();
} catch (IOException e) {
System.out.println("读取数据文件失败:" + e.getMessage());
}
}
如果需要扩展功能,还可以增加降雨量区间统计,比如统计降雨量在0-10毫米、10-25毫米、25毫米以上的天数,只需要遍历数组判断数值区间即可。另外如果处理多月的降雨量数据,可以将单月的数据封装成对象,再用集合存储多个月的对象进行跨月分析。
实际开发中还需要注意数据合法性校验,比如降雨量不能为负数,文件读取时的路径异常处理,避免程序因为异常数据崩溃。掌握这类基础的数据统计逻辑后,也可以迁移到其他类似的数据分析场景中,比如气温统计、销量统计等。