数组数据清洗方法输出异常:未打印预期结果的问题排查
问题解决:销售数据修正逻辑错误
需求说明
- 在
SalesAnalyzer.java中:实现cleanData()方法,遍历sales数组,使用Math.abs()获取每个元素的绝对值,返回包含修正后销售值的新数组。 - 在
MyConsole.java中:声明并初始化correctedSales数组存储cleanData()的返回值,打印该数组内容。
现有代码
MyConsole.java
public class MyConsole { public static void main(String[] args) { double[] sales = {-4.05, 5.06, 3.99, -3.99, -1.99, 2.05, 10.50, -7.85, 6.73, -8.45}; SalesAnalyzer mySales = new SalesAnalyzer(sales); // TO DO #2: Call the cleanData() method. double [] correctedSale = mySales.cleanData(); System.out.println("\n\n \n"); //System.out.println(correctedSale); for(double c: correctedSale){ // that list top 30 low pop from getLowPopCountrie System.out.println(c);// supposed to cycle through array and print out new elements } // TO DO #3: Print the values stored in the new array } }
SalesAnalyzer.java
/* * Analyzes sales data for a business */ public class SalesAnalyzer { private double[] sales; // The list of sales /* * Constructor to create a SalesAnalyzer * with the specified array of sales */ public SalesAnalyzer(double[] sales) { this.sales = sales; } /* * Returns a new array containing corrected sales values */ public double[] cleanData() { double[] cleanList= new double[sales.length]; // TO DO #1: Return a new array containing the corrected sales values. //for(double values : sales){ // double result = Math.abs(values); //} int track = 0; // tracking for(int index = 0; index< sales.length; index ++){ // cyling through array, starting @ first index // if(sales[index] < 15){ // current element less than 15 if (track < sales.length){ // making sure both lists are the same length sales[track] = cleanList[index]; //aligning w new lisy cleanList[index] = Math.abs(index); track ++; // track out of 30 } //brack 4 if 2 // }// brack for if [] //return cleanList; } return cleanList; } }
问题详情
- 原数组:
{-4.05, 5.06, 3.99, -3.99, -1.99, 2.05, 10.50, -7.85, 6.73, -8.45} - 实际控制台输出:
{0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0} - 预期输出:
{4.05, 5.06, 3.99, 3.99, 1.99, 2.05, 10.50, 7.85, 6.73, 8.45}
错误根源
SalesAnalyzer类的cleanData()方法存在多处无效逻辑:
- 核心错误:对循环索引
index取绝对值,而非目标数组元素sales[index],导致输出的是索引数值而非销售数据的绝对值。 - 冗余操作:
sales[track] = cleanList[index]属于无效赋值,此时cleanList[index]尚未初始化,还会破坏原数组的数据。 - 多余变量:
track变量和track < sales.length判断完全没必要,循环本身已经通过index遍历了整个数组,长度天然匹配。
修正后的代码
修正后的SalesAnalyzer.java
/* * Analyzes sales data for a business */ public class SalesAnalyzer { private double[] sales; // The list of sales /* * Constructor to create a SalesAnalyzer * with the specified array of sales */ public SalesAnalyzer(double[] sales) { this.sales = sales; } /* * Returns a new array containing corrected sales values */ public double[] cleanData() { double[] cleanList = new double[sales.length]; // 遍历原数组,对每个元素取绝对值存入新数组 for(int index = 0; index < sales.length; index++){ cleanList[index] = Math.abs(sales[index]); } return cleanList; } }
也可以用增强for循环简化代码:
public double[] cleanData() { double[] cleanList = new double[sales.length]; int index = 0; for(double value : sales){ cleanList[index++] = Math.abs(value); } return cleanList; }
验证结果
修正后运行MyConsole.java,控制台会输出预期的销售数据绝对值:
4.05 5.06 3.99 3.99 1.99 2.05 10.5 7.85 6.73 8.45
内容的提问来源于stack exchange,提问作者A Person
相关产品推荐
相关产品推荐

