对比两个ArrayList并合并:按coin匹配将price字段合并至coinList
解决方案:匹配Coin名称并合并两个列表数据
当然可以实现!这是Java开发里很常见的集合数据合并场景,咱们一步步来搞定它:
核心思路
- 先把
priceList转换成以coin名称为Key、price为Value的Map,这样后续查找价格的效率会大幅提升(从嵌套循环的O(n*m)降到O(n)) - 遍历
coinList中的每个元素,根据coin名称去Map中匹配对应的price,找到后直接添加到第一个列表的元素里
推荐实现:使用自定义实体类(类型更安全)
实际开发中更推荐用自定义类来存储这些数据,避免Map的类型转换风险,代码可读性也更高:
1. 定义实体类
// 存储coin基础信息的类,新增price字段用于接收合并后的数据 class CoinEntry { private String coin; private double confirmed; private double price; // 新增的价格字段 // 构造器 public CoinEntry(String coin, double confirmed) { this.coin = coin; this.confirmed = confirmed; } // Getter和Setter方法 public String getCoin() { return coin; } public double getConfirmed() { return confirmed; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } // 重写toString方便查看结果 @Override public String toString() { return "CoinEntry{coin='" + coin + "', confirmed=" + confirmed + ", price=" + price + "}"; } } // 存储coin价格信息的类 class PriceEntry { private String coin; private double price; public PriceEntry(String coin, double price) { this.coin = coin; this.price = price; } public String getCoin() { return coin; } public double getPrice() { return price; } }
2. 合并数据的核心代码
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class CoinPriceMerger { public static void main(String[] args) { // 初始化你的coinList List<CoinEntry> coinList = new ArrayList<>(); coinList.add(new CoinEntry("Litecoin", 0.00)); coinList.add(new CoinEntry("Bitcoin", 0.00)); coinList.add(new CoinEntry("Zcoin", 0.00)); // 初始化你的priceList List<PriceEntry> priceList = new ArrayList<>(); priceList.add(new PriceEntry("Bitcoin", 1000)); priceList.add(new PriceEntry("Litecoin", 1000)); priceList.add(new PriceEntry("Zcoin", 1000)); // 把priceList转成Map,快速查找价格 Map<String, Double> priceMap = priceList.stream() .collect(Collectors.toMap(PriceEntry::getCoin, PriceEntry::getPrice)); // 遍历coinList,匹配并设置价格 for (CoinEntry coin : coinList) { String coinName = coin.getCoin(); if (priceMap.containsKey(coinName)) { coin.setPrice(priceMap.get(coinName)); } // 可选:如果某个coin在priceList中不存在,可以设置默认值或做异常处理 // else { coin.setPrice(0.0); } } // 输出测试结果 coinList.forEach(System.out::println); } }
备选实现:使用HashMap存储数据(适配你的原始格式)
如果你的列表元素是用HashMap<String, Object>存储的,也可以这样实现:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MapBasedMerger { public static void main(String[] args) { // 初始化coinList List<Map<String, Object>> coinList = new ArrayList<>(); Map<String, Object> litecoin = new HashMap<>(); litecoin.put("coin", "Litecoin"); litecoin.put("confirmed", 0.00); coinList.add(litecoin); Map<String, Object> bitcoin = new HashMap<>(); bitcoin.put("coin", "Bitcoin"); bitcoin.put("confirmed", 0.00); coinList.add(bitcoin); Map<String, Object> zcoin = new HashMap<>(); zcoin.put("coin", "Zcoin"); zcoin.put("confirmed", 0.00); coinList.add(zcoin); // 初始化priceList List<Map<String, Object>> priceList = new ArrayList<>(); Map<String, Object> btcPrice = new HashMap<>(); btcPrice.put("coin", "Bitcoin"); btcPrice.put("price", 1000); priceList.add(btcPrice); Map<String, Object> ltcPrice = new HashMap<>(); ltcPrice.put("coin", "Litecoin"); ltcPrice.put("price", 1000); priceList.add(ltcPrice); Map<String, Object> zecPrice = new HashMap<>(); zecPrice.put("coin", "Zcoin"); zecPrice.put("price", 1000); priceList.add(zecPrice); // 转换priceList为Map Map<String, Integer> priceMap = new HashMap<>(); for (Map<String, Object> priceEntry : priceList) { String coinName = (String) priceEntry.get("coin"); Integer price = (Integer) priceEntry.get("price"); priceMap.put(coinName, price); } // 合并数据到coinList for (Map<String, Object> coinEntry : coinList) { String coinName = (String) coinEntry.get("coin"); if (priceMap.containsKey(coinName)) { coinEntry.put("price", priceMap.get(coinName)); } } // 输出结果 coinList.forEach(System.out::println); } }
小提示
- 用Map做中间转换是关键,尤其是当你的列表数据量较大时,能显著提升性能
- 如果存在coin名称不匹配的情况,记得在代码中处理(比如设置默认价格、打印日志等)
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

