如何同步降序排序double数组sales与对应String数组sales1
解决销售额数组排序后与销售人员姓名不匹配的问题
我明白你现在遇到的困扰——对double类型的sales[]按降序排序后,对应的销售人员姓名数组sales1[]出现了部分匹配错误的情况。咱们先从你的代码入手分析,再给出两种靠谱的解决方案。
一、现有代码的问题排查
先看你当前的排序实现:
public void sort(double sales[], String sales1[]) { int i, j; double temp; String temp1; for (i = 0; i < sales.length; i++) { for (j = i + 1; j < sales.length; j++) { if (sales[i] < sales[j]) { temp1 = sales1[i]; sales1[i] = sales1[j]; sales1[j] = temp1; temp = sales[i]; sales[i] = sales[j]; sales[j] = temp; } } } }
从逻辑上看,这段选择排序的写法是正确的:每次发现sales[j]比sales[i]大时,同时交换两个数组对应位置的元素,理论上能保证姓名和销售额的关联关系。那为什么会出现不匹配?大概率是这两个场景:
- 调用方法时,
sales[]和sales1[]的长度不一致(比如一个是5个元素,另一个是4个),导致部分元素无法对应; - 排序后输出/使用数组时,出现了索引错误(比如循环遍历的长度搞错了)。
二、修正后的数组排序方案
如果坚持使用两个数组的方式,我们可以在代码里加入参数校验,提前规避数组长度不匹配的问题,同时保留原有的排序逻辑:
public void sortSalesWithNames(double[] sales, String[] salesNames) { // 先校验参数合法性,避免后续出错 if (sales == null || salesNames == null || sales.length != salesNames.length) { throw new IllegalArgumentException("销售额数组和姓名数组必须非空且长度一致"); } int i, j; double tempSales; String tempName; int length = sales.length; for (i = 0; i < length; i++) { for (j = i + 1; j < length; j++) { // 降序排序:当前元素小于后续元素时交换 if (sales[i] < sales[j]) { // 交换姓名 tempName = salesNames[i]; salesNames[i] = salesNames[j]; salesNames[j] = tempName; // 交换销售额 tempSales = sales[i]; sales[i] = sales[j]; sales[j] = tempSales; } } } }
这样能提前发现参数错误,避免出现莫名其妙的关联匹配问题。
三、更健壮的方案:用对象封装关联数据
其实,把销售额和姓名这类强关联的数据封装成一个类,才是更符合面向对象思想的做法,能从根源上杜绝“数据关联错误”的问题。示例如下:
1. 定义销售人员类
class SalesPerson { private String name; private double salesAmount; public SalesPerson(String name, double salesAmount) { this.name = name; this.salesAmount = salesAmount; } // Getter方法,用于获取属性 public String getName() { return name; } public double getSalesAmount() { return salesAmount; } }
2. 对对象数组排序
使用Arrays.sort()结合自定义比较器,实现按销售额降序排序:
import java.util.Arrays; import java.util.Comparator; public class SalesSortDemo { public static void main(String[] args) { // 初始化你的销售人员数据 SalesPerson[] salesPeople = { new SalesPerson("kapas", 1200.5), new SalesPerson("redang", 2800.0), new SalesPerson("perhentian", 1950.0), new SalesPerson("tenggol", 3500.0), new SalesPerson("lang tengah", 1600.0) }; // 按销售额降序排序 Arrays.sort(salesPeople, (sp1, sp2) -> Double.compare(sp2.getSalesAmount(), sp1.getSalesAmount()) ); // 输出排序结果 for (SalesPerson sp : salesPeople) { System.out.println(sp.getName() + ": " + sp.getSalesAmount()); } } }
这种方式把姓名和销售额绑定在一起,排序时永远不会出现关联错位,代码的可读性和可维护性也更强。
内容的提问来源于stack exchange,提问作者Aidid kamil
相关产品推荐
相关产品推荐

