1.请使用JAVA代码实现以下需求,入参是一组YYYY-MM格式的字符串集合,下面是计算逻辑: (1)数据预处理 - 去重与排序: 对提取的月份数据进行去重,并按照时间升序排列,便于后续连续性判断。 (2)单一记录情况 - 单一月份: 若所有记录均为同一月份(或仅存在一个有效月份),直接展示该月份。 示例: - 结果::2025-02` (3)多记录情况 - 连续月份合并: - 连续性判断: 判断排序后的月份是否为连续月份(例如,2024-02 至 2024-03,即为连续;跨年情况如2023-12与2024-01也视为连续)。 - 合并规则: 对于连续的月份区间,需完整显示该区间的起始年月和结束年月,格式为 `YYYY-MM~YYYY-MM`。 示例: - 连续月份:`2024-02,2024-03,2024-04` 合并后展示为 `2024-02~2024-04` - 跨年连续:`2023-12,2024-01,2024-02` 合并后展示为 `2023-12~2024-02` - 非连续月份处理: 将不连续的月份或区间分别处理,格式保持 “YYYY-MM”,各区间之间使用英文逗号 `,` 拼接。 示例: - 多个区间:`2024-02~2024-04,2024-09~2024-12` (4)最终输出格式 示例: - 单一月份::2025-02` - 多个连续区间::2024-02~2024-04,2024-09~2024-12`
时间: 2025-07-12 19:40:38 浏览: 10
<think>好的,我需要解决用户的问题:用Java对一组YYYY-MM格式的字符串集合进行去重、排序,并按连续性和非连续性规则合并。首先,我得理清每个步骤的需求。
首先,去重。用户可能有重复的月份数据,所以需要先去除重复项。Java中可以用Set来去重,比如TreeSet,因为它还能自动排序。不过用户后面还需要排序,可能用TreeSet的话可以同时完成去重和排序,但需要考虑日期格式是否正确。
然后排序。假设字符串已经是YYYY-MM格式,转换成可比较的对象,比如YearMonth类,Java 8以后有这个类,可以方便处理。将字符串解析为YearMonth对象,存入列表,然后排序。这样可以确保顺序正确。
接下来是合并连续月份。这部分比较复杂。需要遍历排序后的列表,判断相邻的月份是否连续。比如2023-01和2023-02是连续的,可以合并成“2023-01~2023-02”。如果是单个不连续的月份,就单独列出。如果是多个连续的,合并成起始和结束月份。非连续的则单独处理。
具体步骤可能如下:
1. 输入字符串列表,去重,转换为YearMonth对象。
2. 对YearMonth列表进行排序。
3. 遍历排序后的列表,逐个比较相邻的月份是否连续。
4. 记录连续的范围,当遇到不连续的时候,生成对应的合并字符串。
5. 处理最后一个范围。
需要注意边界情况,比如列表为空,只有一个月份,或者全部连续等情况。此外,合并后的格式需要正确,比如连续三个月份以上也要合并成起始和结束。
代码结构方面,可能需要以下几个方法:
- 主方法处理输入,调用各个步骤。
- 转换和排序方法。
- 合并连续月份的方法。
另外,用户提供的引用中有提到使用HashMap的例子,可能和参数处理有关,但这里主要是日期处理,暂时不需要。引用3提到Java命名规范,需要注意代码风格。引用4提到数据抽取工具,可能与问题无关。
关于可能的异常处理,比如字符串格式不正确,是否需要处理?用户的问题中没有提到,可能假设输入都是正确的,但实际中可能需要校验,比如捕获DateTimeParseException。
现在开始写代码的大纲:
1. 将字符串列表转换为YearMonth,去重,排序。
2. 遍历排序后的列表,构建合并后的字符串列表。
3. 合并逻辑:记录当前起始月份,当前结束月份,比较下一个是否连续(加1个月),如果是,更新结束月份;否则,生成合并字符串,并重置起始和结束月份。
例如,对于输入["2023-01", "2023-03", "2023-02", "2023-02"],去重排序后是2023-01, 2023-02, 2023-03。合并后变成"2023-01~2023-03"。
另一个例子:["2023-01", "2023-03", "2024-01"],合并后是"2023-01", "2023-03", "2024-01"。
代码实现时,可以用一个列表来存储结果,遍历过程中维护当前区间的start和end。当遇到下一个月份不是end+1时,就将当前区间加入结果,然后重置start和end为当前月份。否则,更新end。
最后,将最后一个区间加入结果。
测试案例需要考虑各种情况,比如单个月份、多个连续、间断等情况。
现在,按照这个思路来编写代码,确保符合Java语法,使用TreeSet去重和排序,利用YearMonth类处理月份,最后合并。</think>以下是实现该需求的Java代码,包含去重、排序及合并连续月份的功能:
```java
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
public class MonthProcessor {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM");
public static List<String> processMonths(List<String> input) {
// 1. 去重并转换为YearMonth对象
Set<YearMonth> uniqueMonths = input.stream()
.map(s -> YearMonth.parse(s, FORMATTER))
.collect(Collectors.toCollection(TreeSet::new));
if (uniqueMonths.isEmpty()) {
return Collections.emptyList();
}
// 2. 转换为有序列表
List<YearMonth> sorted = new ArrayList<>(uniqueMonths);
// 3. 合并连续月份
List<String> result = new ArrayList<>();
YearMonth start = sorted.get(0);
YearMonth end = start;
for (int i = 1; i < sorted.size(); i++) {
YearMonth current = sorted.get(i);
if (end.plusMonths(1).equals(current)) {
end = current;
} else {
addToResult(result, start, end);
start = current;
end = current;
}
}
addToResult(result, start, end);
return result;
}
private static void addToResult(List<String> result, YearMonth start, YearMonth end) {
if (start.equals(end)) {
result.add(start.format(FORMATTER));
} else {
result.add(start.format(FORMATTER) + "~" + end.format(FORMATTER));
}
}
public static void main(String[] args) {
List<String> testData = Arrays.asList(
"2023-01", "2023-03", "2023-05",
"2023-06", "2023-07", "2023-07",
"2023-10", "2024-01"
);
List<String> processed = processMonths(testData);
processed.forEach(System.out::println);
}
}
```
实现说明:
1. **去重处理**:使用`Stream API`配合`TreeSet`实现自动排序和去重[^1]
2. **日期转换**:使用`YearMonth`类处理日期验证和计算,保证格式正确性
3. **连续判断**:通过`plusMonths(1)`方法判断月份连续性
4. **结果合并**:使用起始-结束标记格式处理连续区间
阅读全文
相关推荐



















