Java统计每天每个水表的用水量
时间: 2024-10-19 14:13:27 浏览: 20
在Java中,统计每天每个水表的用水量,通常涉及到读取数据存储(如CSV文件、数据库等)、日期解析以及计数聚合。下面是一个简单的示例,假设我们有一个CSV文件,其中包含`water_meter_id`(水表ID)和`usage_date`(使用日期)以及`usage_amount`(用水量)字段:
1. **读取数据**:
使用`java.io.FileReader`和`java.text.SimpleDateFormat`从CSV文件读取数据,将日期字符串转换为`LocalDate`或`java.time.LocalDate`。
```java
List<WaterMeterUsage> waterMeters = new ArrayList<>();
FileReader reader = new FileReader("water_usage.csv");
String line;
while ((line = reader.readLine()) != null) {
String[] data = line.split(",");
String meterId = data[0];
LocalDate usageDate = SimpleDateFormat.getInstance("yyyy-MM-dd").parse(data[1]);
int usageAmount = Integer.parseInt(data[2]);
WaterMeterUsage entry = new WaterMeterUsage(meterId, usageDate, usageAmount);
waterMeters.add(entry);
}
reader.close();
```
2. **按天和水表ID分组**:
使用Java 8的Stream API或者Apache Commons Lang的`GroupingUtils.groupBy`函数,按日期和水表ID对数据进行分组。
```java
Map<LocalDate, Map<String, Long>> dailyUsagePerMeter = waterMeters.stream()
.collect(Collectors.groupingBy(WaterMeterUsage::getDate, Collectors.groupingBy(WaterMeterUsage::getMeterId, Collectors.summingInt(WaterMeterUsage::getUsageAmount)));
```
3. **获取每日每个水表的用水量**:
最终结果就是`dailyUsagePerMeter`,它是一个`Map`,键是日期,值是一个嵌套的`Map`,外部键是水表ID,内部值是该水表当天的总用水量。
```java
for (Map.Entry<LocalDate, Map<String, Long>> dayEntry : dailyUsagePerMeter.entrySet()) {
LocalDate date = dayEntry.getKey();
System.out.println("日期:" + date);
for (Map.Entry<String, Long> meterEntry : dayEntry.getValue().entrySet()) {
String meterId = meterEntry.getKey();
long usageAmount = meterEntry.getValue();
System.out.println("\t水表 " + meterId + " 当日用水量: " + usageAmount);
}
}
```
阅读全文