Java中如何从ArrayList中提取各id对应的最高版本号
首先纠正一个基础误区:Java标准库中的ArrayList仅支持单个泛型参数,不存在支持键值对存储的ArrayList<String,String>及put方法,你描述的结构实际是可存储重复键的多值映射结构,常见实现为Guava的ArrayListMultimap,或者用List<Map.Entry<String,String>>模拟。以下基于你给出的示例数据给出可直接运行的解法:
实现逻辑
- 按ID将所有版本号分组
- 对每个ID对应的版本号做比对,提取最大值。你给出的版本号格式为
年份_主版本号.次版本号,直接用字符串自然排序即可得到正确结果,如有多段位版本号需求可自行调整为按数值比对。
代码示例(JDK 8+)
import java.util.AbstractMap; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class VersionFilter { public static void main(String[] args) { // 模拟你给出的原始键值对数据 List<Map.Entry<String, String>> rawList = new ArrayList<>(); rawList.add(new AbstractMap.SimpleEntry<>("A101","2020_1.0")); rawList.add(new AbstractMap.SimpleEntry<>("A101","2020_3.0")); rawList.add(new AbstractMap.SimpleEntry<>("A101","2020_2.0")); rawList.add(new AbstractMap.SimpleEntry<>("A102","2020_2.0")); rawList.add(new AbstractMap.SimpleEntry<>("A102","2020_1.0")); // 分组后取每个ID的最大版本号 Map<String, String> resultMap = rawList.stream() .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.collectingAndThen( Collectors.maxBy(Comparator.comparing(Map.Entry::getValue)), opt -> opt.map(Map.Entry::getValue).orElse("无版本记录") ) )); // 打印结果 resultMap.forEach((id, version) -> System.out.printf("%s对应%s%n", id, version)); } }
输出结果
A101对应2020_3.0
A102对应2020_2.0
补充说明
- 如果你使用Guava的
ArrayListMultimap存储原始数据,直接调用asMap()方法获取每个ID对应的版本集合,取最大值即可,逻辑完全一致。 - 若版本号存在跨年份、多位次版本(如
2020_1.10和2020_1.2)的情况,需要将版本号拆分后按数值段比对,避免字符串排序误差。
内容的提问来源于stack exchange,提问作者Sachin Singh
相关产品推荐
相关产品推荐

