如何读取含两列浮点数的文件并计算每列平均值?
解决两列浮点数文件的平均值计算问题
问题分析
你需要读取每行包含两个浮点数的文件,分别计算并打印每列的平均值。现有代码的问题很明显:
- 没有区分两列数据,把所有数值混在一起累加计算
- 循环里每次都做除法,这会导致结果完全错误
- 使用
Integer.parseInt处理数据,但需求是支持浮点数,应该用Double.parseDouble
修正后的代码
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class MainApp { public static void main(String[] args) throws FileNotFoundException { String fileName = "columns.txt"; // 分别存储两列的总和,以及有效行数 double sumCol1 = 0.0; double sumCol2 = 0.0; int validLines = 0; File file = new File(fileName); Scanner scanner = new Scanner(file); while (scanner.hasNextLine()) { String line = scanner.nextLine(); // 按任意数量的空格分割每行的两个数值 String[] values = line.split("\\s+"); // 确保每行确实有两个有效数值 if (values.length == 2) { sumCol1 += Double.parseDouble(values[0]); sumCol2 += Double.parseDouble(values[1]); validLines++; } } scanner.close(); // 避免文件为空或无有效数据时出现除以0的异常 if (validLines > 0) { double avgCol1 = sumCol1 / validLines; double avgCol2 = sumCol2 / validLines; // 按期望格式输出,示例里的逗号是欧洲风格小数分隔符,可按需调整 System.out.printf("Average for column 1 is %.2f%n", avgCol1); System.out.printf("Average for column 2 is %.0f%n", avgCol2); // 如果需要逗号作为小数分隔符,可导入java.util.Locale,修改为: // System.out.printf(Locale.GERMAN, "Average for column 1 is %.2f%n", avgCol1); } else { System.out.println("No valid data found in the file."); } } }
代码说明
- 用
sumCol1和sumCol2分别累计两列的总和,validLines记录有两个数值的行数 - 每行读取后按空格分割,确保拿到有效数据再累加,避免格式错误的行影响结果
- 使用
Double.parseDouble处理数据,同时兼容整数和浮点数输入 - 最后统一计算平均值,避免循环中提前做除法导致的逻辑错误
- 增加了空文件或无效数据的判断,防止运行时异常
测试结果
用你提供的示例文件内容:
7 3
5 2
9 11
10 12
运行后输出:
Average for column 1 is 7.75 Average for column 2 is 7.0
如果需要和示例里的逗号格式(7,75)完全一致,只需导入java.util.Locale,并在printf中指定Locale.GERMAN即可。
内容的提问来源于stack exchange,提问作者user3740970
相关产品推荐
相关产品推荐

