如何对包含$符号的价格值进行正确排序?
解决带$符号的价格字符串排序问题
你当前的代码用字符串默认的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
相关产品推荐
相关产品推荐

