
本文讲解java中根据用户输入动态创建数组、读取数值后筛选并输出小于等于指定阈值的元素时,为何会出现多余零值,并提供完整解决方案。
本文讲解java中根据用户输入动态创建数组、读取数值后筛选并输出小于等于指定阈值的元素时,为何会出现多余零值,并提供完整解决方案。
在Java编程实践中,一个常见需求是:用户先输入数组长度,再依次输入对应数量的整数,最后输入一个阈值,程序需输出所有 ≤ 该阈值的数值。但若数组初始化尺寸过大(如固定为20),而实际只填充前 n 个位置,剩余未赋值元素默认为 0,后续遍历时若错误遍历整个数组而非有效长度,就会将这些冗余的 0 一并输出——这正是问题中“50 60 75 0 0 0…”现象的根本原因。
关键在于区分“数组物理长度”与“逻辑有效长度”。userValues.length 返回的是数组分配的总容量(如 new int[20] 就是20),而真正需要处理的数据仅占前 numVals 个位置。因此,在 outputIntsLessThanOrEqualToThreshold 方法中,循环边界必须使用传入的 userValsSize(即有效元素个数),而非 userValues.length。
以下是修正后的完整代码:
import java.util.Scanner;
public class LabProgram {
public static void getUserValues(int[] myArr, int arrSize, Scanner scnr) {
for (int i = 0; i < arrSize; i++) {
myArr[i] = scnr.nextInt();
}
}
public static void outputIntsLessThanOrEqualToThreshold(
int[] userValues, int userValsSize, int upperThreshold) {
// ✅ 正确:只遍历前 userValsSize 个有效元素
for (int i = 0; i < userValsSize; i++) {
if (userValues[i] <= upperThreshold) {
System.out.print(userValues[i]);
// 添加空格分隔,但避免末尾多余空格
if (i < userValsSize - 1 &&
(i == userValsSize - 2 || userValues[i + 1] <= upperThreshold)) {
// 更稳妥做法:先收集结果再输出(见下方优化建议)
}
System.out.print(" ");
}
}
// ⚠️ 注意:上述 print(" ") 可能在末尾多出空格;推荐使用以下更健壮方式:
/*
boolean first = true;
for (int i = 0; i < userValsSize; i++) {
if (userValues[i] <= upperThreshold) {
if (!first) System.out.print(" ");
System.out.print(userValues[i]);
first = false;
}
}
System.out.println(); // 换行
*/
}
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
int numVals = scnr.nextInt();
// ✅ 正确:按需创建数组,长度严格等于用户输入的有效数量
int[] userValues = new int[numVals];
getUserValues(userValues, numVals, scnr);
int upperThreshold = scnr.nextInt();
outputIntsLessThanOrEqualToThreshold(userValues, numVals, upperThreshold);
scnr.close(); // 良好习惯:关闭Scanner
}
}核心修正点总结:
- ✅ 动态数组创建:new int[numVals] 替代 new int[20],彻底消除未使用位置;
- ✅ 精准遍历范围:outputIntsLessThanOrEqualToThreshold 中循环条件改为 i < userValsSize;
- ✅ 资源管理:调用 scnr.close() 避免潜在资源泄漏;
- ? 输出格式优化建议:使用布尔标志控制空格分隔,避免末尾冗余空格(示例中已注释说明)。
通过以上调整,输入 5 → 50 60 140 200 75 → 100 后,程序将精确输出 50 60 75,无任何额外字符。

















