如何将字符串版本号列表按版本分支分组为List<List<String>>结构
实现思路
核心是按版本号的前两段(主版本+次版本)作为分组标识,把相同标识的版本归入同一个子列表:
- 用哈希表暂存分组结果,key为「主版本.次版本」的分支标识,value为对应分支的版本列表
- 遍历原始版本列表,拆分每个版本号生成分组key,将版本号存入对应key的列表
- 最后把哈希表的所有值存入你初始化的
releases集合即可
如果需要版本列表按高低版本排序,可以额外加排序逻辑。
Java 实现代码
import java.util.*; public class VersionGroupDemo { public static void main(String[] args) { // 原始版本列表 List<String> versionList = Arrays.asList("7.5.9", "7.5.8", "7.5.7", "7.5.6", "7.5.5", "7.5.4", "7.5.3", "7.5.2", "7.5.1", "7.5.0", "6.5.1", "6.5.0"); List<List<String>> releases = new ArrayList<>(); Map<String, List<String>> groupMap = new HashMap<>(); for (String version : versionList) { String[] parts = version.split("\\."); // 兼容非标准版本号,避免数组越界 if (parts.length < 2) { continue; } String branchKey = parts[0] + "." + parts[1]; // 不存在分支则新建列表,存在则直接追加 groupMap.computeIfAbsent(branchKey, k -> new ArrayList<>()).add(version); } releases.addAll(groupMap.values()); // 可选:每个子列表按版本从高到低排序 for (List<String> branchVersions : releases) { branchVersions.sort((v1, v2) -> { String[] v1Seg = v1.split("\\."); String[] v2Seg = v2.split("\\."); // 按第三段版本号倒序,需要全版本比较可以扩展逻辑 return Integer.compare(Integer.parseInt(v2Seg[2]), Integer.parseInt(v1Seg[2])); }); } // 输出验证 System.out.println(releases); } }
Groovy 实现代码
你示例中用到了def定义列表,Groovy语法可以更简化实现:
def versionList = ["7.5.9", "7.5.8", "7.5.7", "7.5.6", "7.5.5", "7.5.4", "7.5.3", "7.5.2", "7.5.1", "7.5.0", "6.5.1", "6.5.0"] List<List<String>> releases = versionList.groupBy { def parts = it.split(/\./) "${parts[0]}.${parts[1]}" }.values().toList() // 可选:按版本倒序排序 releases.each { it.sort { v -> -v.split(/\./)[2].toInteger() } }
注意事项
- 如果你的版本分支规则不是「主版本.次版本」,比如需要按三位
x.y.z分组,修改拼接branchKey的逻辑取前三位即可 - 代码中已经加了基础的版本号格式校验,不符合规则的版本会自动跳过,可以根据业务需求调整校验逻辑
- 排序逻辑可以根据你的需要调整,比如要从小到大排序把比较逻辑反过来就行
内容的提问来源于stack exchange,提问作者ivan kolev
相关产品推荐
相关产品推荐

