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

如何对包含$符号的价格值进行正确排序?

解决带$符号的价格字符串排序问题

你当前的代码用字符串默认的compareTo方法排序,是按字典序比较的(比如$15.99会因为首字符'1'的ASCII值小于'7',排在$7.99前面),这和实际价格的数值排序逻辑不符。要实现正确排序,需要先提取价格的数值部分进行比较,同时保留原字符串的$符号。

修改后的代码

import java.util.*;
import java.math.BigDecimal;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {

        List<String> originalOrder = new ArrayList<>();

        originalOrder.add("$15.994");
        originalOrder.add("$7.99");
        originalOrder.add("$49.99");
        originalOrder.add("$15.99");
        originalOrder.add("$9.99");
        originalOrder.add("$29.99");

        List<String> sortedList = originalOrder.stream()
                .sorted((o1, o2) -> {
                    // 提取$后的数值部分,转为BigDecimal避免浮点精度问题
                    BigDecimal price1 = new BigDecimal(o1.substring(1));
                    BigDecimal price2 = new BigDecimal(o2.substring(1));
                    return price1.compareTo(price2);
                })
                .collect(Collectors.toList());

        System.out.println("Sorted list: " + sortedList);
    }
}

代码说明

  • 用substring(1)去掉字符串开头的$符号,提取纯数字部分
  • 转为BigDecimal类型比较:相比double/float,BigDecimal能精准处理小数价格,避免精度丢失
  • 利用BigDecimal的compareTo方法实现数值排序,最终输出的列表仍保留原字符串的$符号

运行结果

Sorted list: [$7.99, $9.99, $15.99, $15.994, $29.99, $49.99]

内容的提问来源于stack exchange,提问作者Pinky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:34:57