Java不使用Stream,如何简洁输出newPassArray有效元素为字符串?
解决数组
toString()输出空元素的问题 我是一名编程新手(学习时长不足1年),尝试使用
toString()方法输出数组时会显示空索引对应的默认值,希望去掉这些无效元素,只显示合格分数(>=60),且不使用Stream。以下是我的代码:
import java.util.Arrays; public class ArrayStream4 { public static void main(String[] args) { int [] scores = {100, 50, 40, 70, 90}; // 需求:统计合格人数(分数>=60)并输出合格分数、总分、平均分、最高分、最低分 int total = 0; int max = scores[0]; int min = scores[0]; int passCount = 0; int [] newPassArray = new int[scores.length]; int passingIndex = 0; for(int score : scores){ total += score; if(score > max){ max = score; } if (score < min){ min = score; } if(score >= 60){ passCount ++; newPassArray[passingIndex] = score; passingIndex ++; } } for (int i = 0; i < passingIndex; i++) { System.out.print(newPassArray[i]); } System.out.println(); System.out.println("PASS grade: " + Arrays.toString(newPassArray)); System.out.printf("Total grade: %d\n", total); System.out.printf("Min grade: %d\n", min); System.out.printf("Max grade: %d\n", max); System.out.printf("PASSCount: %d\n", passCount); } }
问题原因
你创建的newPassArray长度和原数组scores一致,但合格分数的数量passCount比原数组长度少,数组中未被赋值的位置默认是0(int类型数组的初始值),调用Arrays.toString()时会把这些0也当作元素输出,导致出现冗余的“空元素”。
解决方法
先遍历一次数组统计合格人数,再创建长度刚好等于passCount的数组来存储合格分数,这样数组里就不会有多余的默认值了。修改后的代码如下:
import java.util.Arrays; public class ArrayStream4 { public static void main(String[] args) { int [] scores = {100, 50, 40, 70, 90}; // 需求:统计合格人数(分数>=60)并输出合格分数、总分、平均分、最高分、最低分 int total = 0; int max = scores[0]; int min = scores[0]; int passCount = 0; int passingIndex = 0; // 第一次遍历:统计总分、最高分、最低分、合格人数 for(int score : scores){ total += score; if(score > max){ max = score; } if (score < min){ min = score; } if(score >= 60){ passCount ++; } } // 根据合格人数创建对应长度的数组 int [] newPassArray = new int[passCount]; // 第二次遍历:填充合格分数到新数组 passingIndex = 0; for(int score : scores){ if(score >= 60){ newPassArray[passingIndex] = score; passingIndex ++; } } // 输出合格分数(带空格分隔) for (int score : newPassArray) { System.out.print(score + " "); } System.out.println(); System.out.println("PASS grade: " + Arrays.toString(newPassArray)); System.out.printf("Total grade: %d\n", total); System.out.printf("Average grade: %.2f\n", (double) total / scores.length); // 补充平均分计算 System.out.printf("Min grade: %d\n", min); System.out.printf("Max grade: %d\n", max); System.out.printf("PASSCount: %d\n", passCount); } }
关键修改点
- 拆分遍历逻辑:先统计合格人数,再创建匹配长度的数组,避免数组冗余。
- 补充了需求中提到的平均分计算,通过强制类型转换
(double)total确保结果为浮点数,保留两位小数更直观。 - 优化单个分数的输出格式,添加空格分隔,可读性更好。
内容的提问来源于stack exchange,提问作者Cocopapoo
相关产品推荐
相关产品推荐

