Collections.sort给对象排序

本文介绍了如何使用Java中的Collections.sort方法结合自定义Comparator来对对象列表进行排序。具体实现是通过重写Comparator中的compare方法,根据两个对象之间的距离来进行升序排列。

Collections.sort给对象进行排序:

他有多个重载函数,主要介绍下Collections.sort(list, Comparator)比较对象:


重写Comparator中compare方法:

public class DistanceComparator implements Comparator<Shop> {

	double xAxis;	//要比较的纬度

	double yAxis;	//要比较的经度
	
	public DistanceComparator(double xAxis, double yAxis) {
		this.xAxis = xAxis;
		this.yAxis = yAxis;
	}
	
	@Override
	public int compare(Shop o1, Shop o2) {
		double d1 = MapDistance.distance(yAxis, xAxis, o1.getyAxis(), o1.getxAxis());
		double d2 = MapDistance.distance(yAxis, xAxis, o2.getyAxis(), o2.getxAxis());
		if (d1 > d2) {
			return 1;
		} else if (d1 < d2) {
			return -1;
		} else {
			return 0;
		}
	}
}
解释:如果对象1大于对象2 则返回正数1;如果小于则返回负数-1;相等则为0  这样是把对象按升序排列 否则按降序排列。

<think>我们使用Collections.sort对包含BigDecimal对象的列表进行排序。由于BigDecimal实现了Comparable接口,我们可以直接使用Collections.sort,它会调用BigDecimal的compareTo方法进行排序。 注意:BigDecimal的compareTo方法忽略精度(scale),只比较数值大小,因此适合排序。 步骤: 1. 创建一个包含BigDecimal对象的列表。 2. 使用Collections.sort()方法对列表进行排序,默认是升序排序。 3. 如果需要降序排序,可以使用Collections.sort()配合Comparator.reverseOrder()或者使用Comparator的reversed()方法。 示例代码:</think>### 使用 `Collections.sort` 对 `BigDecimal` 对象列表排序 在 Java 中对包含 `BigDecimal` 对象的列表排序时,推荐直接使用 `Collections.sort()`,因为 `BigDecimal` 已实现 `Comparable` 接口,其 `compareTo()` 方法能正确处理数值比较(忽略精度差异)。以下是完整实践指南: --- #### 1. **基础排序(升序)** ```java import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class BigDecimalSorting { public static void main(String[] args) { List<BigDecimal> amounts = new ArrayList<>(); amounts.add(new BigDecimal("99.99")); amounts.add(new BigDecimal("50.00")); amounts.add(new BigDecimal("100.000")); // 不同精度 // 升序排序(默认使用 compareTo()) Collections.sort(amounts); System.out.println("升序结果: " + amounts); // 输出: [50.00, 99.99, 100.000] } } ``` **原理**:`Collections.sort()` 内部调用 `BigDecimal.compareTo()`,只比较数值大小($100.0 = 100.00$)[^1]。 --- #### 2. **降序排序** ```java // 方法1:使用 reverseOrder() Collections.sort(amounts, Collections.reverseOrder()); // 方法2:使用 Comparator.reversed() Collections.sort(amounts, BigDecimal::compareTo.reversed()); System.out.println("降序结果: " + amounts); // 输出: [100.000, 99.99, 50.00] ``` --- #### 3. **自定义排序规则** 如需按精度或其他属性排序,可使用自定义 `Comparator`: ```java // 按精度(小数位数)排序 Collections.sort(amounts, Comparator.comparingInt(BigDecimal::scale)); // 按字符串长度排序(非常规需求示例) Collections.sort(amounts, Comparator.comparing(b -> b.toString().length())); ``` --- #### 4. **处理空值和特殊值** ```java List<BigDecimal> amountsWithNull = new ArrayList<>(); amountsWithNull.add(null); amountsWithNull.add(BigDecimal.ZERO); // 空值处理:将 null 视为最小值 Collections.sort(amountsWithNull, Comparator.nullsFirst(BigDecimal::compareTo) ); // 特殊值排序:负数、零、正数分组 Collections.sort(amounts, Comparator.comparing((BigDecimal b) -> b.compareTo(BigDecimal.ZERO)) .thenComparing(BigDecimal::abs) ); ``` --- #### 5. **性能优化** 对于大型列表($n > 10^4$),使用 `ArrayList` 而非 `LinkedList`: ```java // 更高效的初始化方式(避免扩容) List<BigDecimal> largeList = new ArrayList<>(Arrays.asList( new BigDecimal("10.5"), new BigDecimal("20.3"), // ... 其他元素 )); Collections.sort(largeList); ``` --- ### 关键注意事项 1. **精度无关性**:`compareTo()` 忽略精度差异($1.0 = 1.00$),符合数值逻辑[^1] 2. **不可变性**:`BigDecimal` 是不可变对象排序不会修改原对象 3. **稳定性**:`Collections.sort()` 使用归并排序,是稳定排序(相等元素保持原顺序) 4. **替代方案**:Java 8+ 可使用流式操作: ```java List<BigDecimal> sorted = amounts.stream() .sorted() .collect(Collectors.toList()); ``` > **最佳实践**:金融计算等场景优先使用 `compareTo()` 的默认排序逻辑,仅在需要严格精度匹配时才自定义 `Comparator`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值