如何依据CoinStatus的position值对CoinPriceQueryResult列表排序?
按CoinStatus的position排序CoinPriceQueryResult列表
解决这个问题的核心是先把CoinStatus里的排序规则转换成可快速查询的映射表,再用这个映射表给CoinPriceQueryResult列表排序,具体步骤如下:
1. 补充类的Getter方法
原类的字段都是私有访问权限,必须添加Getter方法才能读取字段值:
public class CoinPriceQueryResult { private String coinQueryId; private double price; // 构造方法 public CoinPriceQueryResult(String coinQueryId, double price) { this.coinQueryId = coinQueryId; this.price = price; } // Getter public String getCoinQueryId() { return coinQueryId; } public double getPrice() { return price; } } public class CoinStatus { private String coinQueryId; private int position; // 构造方法 public CoinStatus(String coinQueryId, int position) { this.coinQueryId = coinQueryId; this.position = position; } // Getter public String getCoinQueryId() { return coinQueryId; } public int getPosition() { return position; } }
2. 构建position映射表
把CoinStatus列表转换成coinQueryId -> position的HashMap,这样排序时能直接通过coinQueryId拿到对应的排序位置,查询效率为O(1):
Map<String, Integer> positionMap = listCoinStatus.stream() .collect(Collectors.toMap(CoinStatus::getCoinQueryId, CoinStatus::getPosition));
3. 对CoinPriceQueryResult列表排序
有两种常用实现方式:
方式一:直接修改原列表(用Collections.sort)
Collections.sort(listQueryResult, (result1, result2) -> { // 若某个coinQueryId在映射表中不存在,将其放到列表末尾 int pos1 = positionMap.getOrDefault(result1.getCoinQueryId(), Integer.MAX_VALUE); int pos2 = positionMap.getOrDefault(result2.getCoinQueryId(), Integer.MAX_VALUE); return Integer.compare(pos1, pos2); });
方式二:生成新的排序后列表(用Stream API)
List<CoinPriceQueryResult> sortedQueryResult = listQueryResult.stream() .sorted(Comparator.comparingInt(result -> positionMap.getOrDefault(result.getCoinQueryId(), Integer.MAX_VALUE) )) .collect(Collectors.toList());
完整示例代码
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class CoinSortExample { public static void main(String[] args) { // 初始化查询结果列表 List<CoinPriceQueryResult> listQueryResult = new ArrayList<>(); listQueryResult.add(new CoinPriceQueryResult("penny", 1.15)); listQueryResult.add(new CoinPriceQueryResult("nickel", 5.05)); listQueryResult.add(new CoinPriceQueryResult("dime", 10.10)); // 初始化状态列表(排序规则) List<CoinStatus> listCoinStatus = new ArrayList<>(); listCoinStatus.add(new CoinStatus("nickel", 0)); listCoinStatus.add(new CoinStatus("penny", 1)); listCoinStatus.add(new CoinStatus("dime", 2)); // 构建position映射表 Map<String, Integer> positionMap = listCoinStatus.stream() .collect(Collectors.toMap(CoinStatus::getCoinQueryId, CoinStatus::getPosition)); // 排序原列表 Collections.sort(listQueryResult, Comparator.comparingInt(result -> positionMap.getOrDefault(result.getCoinQueryId(), Integer.MAX_VALUE) )); // 验证排序结果 listQueryResult.forEach(result -> System.out.println(result.getCoinQueryId() + ": " + result.getPrice()) ); // 输出顺序:nickel:5.05 → penny:1.15 → dime:10.10 } }
内容的提问来源于stack exchange,提问作者WHOATEMYNOODLES
相关产品推荐
相关产品推荐

