You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

关键修改点

  1. 拆分遍历逻辑:先统计合格人数,再创建匹配长度的数组,避免数组冗余。
  2. 补充了需求中提到的平均分计算,通过强制类型转换(double)total确保结果为浮点数,保留两位小数更直观。
  3. 优化单个分数的输出格式,添加空格分隔,可读性更好。

内容的提问来源于stack exchange,提问作者Cocopapoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:12:44