You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何依据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:35:49