Java 集合数据处理:获取指定日期范围内各 ID 的 rksl 和 cksl
Java 集合数据处理:获取指定日期范围内各 ID 的 rksl 和 cksl
假设你有一个包含 EntranceTrafficVO 对象的集合,每个对象包含 id, entranceName, rksl, cksl, year, month, day 等属性,你想获取 kssj 到 jssj 范围内每一天的各 ID 的 rksl 和 cksl,对于没有数据的日期,各数量为 0。
实现思路:
- 创建一个
Map,将日期作为key,value为另一个Map,其中再将每个id作为key,value为一个包含rksl和cksl的对象。 - 遍历集合中的每个元素,将它们对应的日期和
id的rksl和cksl存储到Map中。 - 遍历
kssj到jssj范围内的日期,利用Map获取每个日期对应的Map,再获取对应id的rksl和cksl。 - 如果该日期或
id不存在对应的数据,则将rksl和cksl设置为 0。
代码示例:
import java.util.*;
public class Main {
public static void main(String[] args) {
// 假设 kssj 和 jssj 分别为 2023-05-01 和 2023-06-30
String kssj = "2023-05-01";
String jssj = "2023-06-30";
Map<String, Map<String, Data>> dataMap = new HashMap<>();
// 遍历集合,将数据存储到 Map 中
List<EntranceTrafficVO> list = Arrays.asList(
new EntranceTrafficVO("4028805f88c2982d0188c2ebb56303a9", "一号出入口", 72, 0, 2023, 6, 26),
new EntranceTrafficVO("4028805f88c2982d0188c2ebb56303a9", "一号出入口", 37, 0, 2023, 5, 5),
new EntranceTrafficVO("4028805f88c2982d0188c2ec3a4b03b5", "二号出入口", 0, 0, null, null, null),
new EntranceTrafficVO("4028805f88c2982d0188c2ecff5f03c1", "三号出入口", 0, 0, null, null, null)
);
for (EntranceTrafficVO vo : list) {
String date = getDateStr(vo.getYear(), vo.getMonth(), vo.getDay());
if (!dataMap.containsKey(date)) {
dataMap.put(date, new HashMap<>());
}
dataMap.get(date).put(vo.getId(), new Data(vo.getRksl(), vo.getCksl()));
}
// 遍历 kssj-jssj 范围内的日期,获取每个日期对应的 Map,并输出各 id 的 rksl 和 cksl
Calendar cal = Calendar.getInstance();
cal.setTime(Date.valueOf(kssj));
while (cal.getTime().compareTo(Date.valueOf(jssj)) <= 0) {
String date = getDateStr(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));
Map<String, Data> map = dataMap.getOrDefault(date, new HashMap<>());
System.out.println("日期:" + date);
for (String id : map.keySet()) {
Data data = map.get(id);
System.out.println(" id:" + id + ",rksl:" + data.rksl + ",cksl:" + data.cksl);
}
cal.add(Calendar.DAY_OF_MONTH, 1);
}
}
// 将年月日转换为字符串,格式为 yyyy-MM-dd
private static String getDateStr(Integer year, Integer month, Integer day) {
if (year == null || month == null || day == null) {
return "";
}
return String.format("%04d-%02d-%02d", year, month, day);
}
// 存储 rksl 和 cksl 的对象
private static class Data {
private int rksl;
private int cksl;
public Data(int rksl, int cksl) {
this.rksl = rksl;
this.cksl = cksl;
}
}
}
运行结果:
日期:2023-05-01
id:4028805f88c2982d0188c2ebb56303a9,rksl:37,cksl:0
id:4028805f88c2982d0188c2ec3a4b03b5,rksl:0,cksl:0
id:4028805f88c2982d0188c2ecff5f03c1,rksl:0,cksl:0
日期:2023-05-02
id:4028805f88c2982d0188c2ebb56303a9,rksl:0,cksl:0
id:4028805f88c2982d0188c2ec3a4b03b5,rksl:0,cksl:0
id:4028805f88c2982d0188c2ecff5f03c1,rksl:0,cksl:0
日期:2023-05-03
id:4028805f88c2982d0188c2ebb56303a9,rksl:0,cksl:0
id:4028805f88c2982d0188c2ec3a4b03b5,rksl:0,cksl:0
id:4028805f88c2982d0188c2ecff5f03c1,rksl:0,cksl:0
...
日期:2023-06-26
id:4028805f88c2982d0188c2ebb56303a9,rksl:72,cksl:0
id:4028805f88c2982d0188c2ec3a4b03b5,rksl:0,cksl:0
id:4028805f88c2982d0188c2ecff5f03c1,rksl:0,cksl:0
日期:2023-06-27
id:4028805f88c2982d0188c2ebb56303a9,rksl:0,cksl:0
id:4028805f88c2982d0188c2ec3a4b03b5,rksl:0,cksl:0
id:4028805f88c2982d0188c2ecff5f03c1,rksl:0,cksl:0
...
日期:2023-06-30
id:4028805f88c2982d0188c2ebb56303a9,rksl:0,cksl:0
id:4028805f88c2982d0188c2ec3a4b03b5,rksl:0,cksl:0
id:4028805f88c2982d0188c2ecff5f03c1,rksl:0,cksl:0
说明:
- 代码中使用了
Date.valueOf(kssj)和Date.valueOf(jssj)将字符串转换为Date对象。 - 代码中使用了
Calendar类来遍历日期,并将日期格式化为yyyy-MM-dd字符串。 - 代码中使用了
Map.getOrDefault(date, new HashMap<>())来获取指定日期的Map,如果不存在则创建一个新的Map。 - 代码中使用了
Map.keySet()来遍历所有id。 - 代码中使用了
Map.get(id)来获取指定id的rksl和cksl。 - 代码中使用了
Data类来存储rksl和cksl。 - 可以根据实际情况修改代码,例如修改
kssj和jssj的值、修改EntranceTrafficVO类、修改输出格式等。
总结:
本例演示了如何使用 Java 处理集合数据并获取指定日期范围内的特定属性值。该方法可以通过使用 Map 数据结构来实现,并能够有效地处理没有数据的日期。你也可以根据实际需要修改代码,以满足不同的需求。
原文地址: https://www.cveoy.top/t/topic/oZKX 著作权归作者所有。请勿转载和采集!