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

数组打印多余零、倒序打印异常及首元素零问题求助

你的两个数组问题解决方案

嘿,咱一步步拆解你遇到的两个问题,结合你描述的现象和代码场景来给你捋清楚:

一、去除数组末尾的多余零

你说的“所有元素列出后出现的多余零”,应该是指数组初始化时长度比实际填充的有效元素长,剩下的默认零值对吧?比如创建了长度为10的数组,但只填充了前6个随机数,后面4个都是0。这里给你两种靠谱的解决方法:

方法1:截断数组到最后一个有效元素的位置

先找到数组中最后一个非零元素的索引,然后用Arrays.copyOf截断数组:

import java.util.Arrays;
import java.util.Random;

public class TrimZeros {
    public static void main(String[] args) {
        int[] vars = new int[10];
        Random random = new Random();
        
        // 模拟填充前6个元素
        for (int i = 0; i < 6; i++) {
            vars[i] = random.nextInt(100);
        }
        
        // 找到最后一个非零元素的索引
        int lastValidIndex = -1;
        for (int i = 0; i < vars.length; i++) {
            if (vars[i] != 0) {
                lastValidIndex = i;
            }
        }
        
        // 处理全零的特殊情况
        if (lastValidIndex == -1) {
            int[] trimmed = new int[0];
            System.out.println(Arrays.toString(trimmed));
            return;
        }
        
        // 截断数组
        int[] trimmed = Arrays.copyOf(vars, lastValidIndex + 1);
        System.out.println("去除多余零后的数组:" + Arrays.toString(trimmed));
    }
}

方法2:用动态列表过滤后转数组

如果不想手动找索引,直接用ArrayList把有效元素装进去再转数组(适合需要去掉所有零的场景):

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class FilterZeros {
    public static void main(String[] args) {
        int[] vars = new int[10];
        Random random = new Random();
        for (int i = 0; i < 6; i++) {
            vars[i] = random.nextInt(100);
        }
        
        ArrayList<Integer> validElements = new ArrayList<>();
        for (int num : vars) {
            if (num != 0) {
                validElements.add(num);
            }
        }
        
        // 转成int数组
        int[] result = validElements.stream().mapToInt(Integer::intValue).toArray();
        System.out.println(Arrays.toString(result));
    }
}

二、倒序打印数组的问题分析与解决

你遇到的三个现象:打印第一个元素是零、额外输出零、修改循环触发数组越界,其实根源都是数组索引操作错误和未填充完全数组导致的,咱一个个说:

问题原因拆解

  1. 打印第一个元素是零:倒序打印的第一个元素是原数组的最后一个位置(索引vars.length-1),如果这个位置没被你填充随机数,int数组的默认值就是0,所以第一个打出来的就是0。
  2. 额外输出零:和上面同理,你打印了数组中那些没被填充的位置,这些位置都是默认的0。
  3. ArrayIndexOutOfBoundsException:数组索引的范围是0到vars.length-1,如果你的循环起始值设成vars.length(比如for(int i = vars.length; i >=0; i--)),第一次访问vars[i]就会超出索引范围;或者循环终止条件写错(比如i > 0会漏掉索引0,但如果写成i > -1但起始值不对也会出问题)。

正确的倒序打印代码

情况1:数组已经被完全填充(所有元素都是随机数)

直接从最后一个有效索引(vars.length-1)遍历到0:

import java.util.Random;

public class EZD_printBackwards {
    static int vars[] = new int[5]; // 假设数组长度5

    public static void main(String[] args) {
        Random random = new Random();
        // 填充整个数组,避免留下默认零
        for (int i = 0; i < vars.length; i++) {
            vars[i] = random.nextInt(100);
        }

        // 正确倒序打印
        System.out.println("倒序输出的数组元素:");
        for (int i = vars.length - 1; i >= 0; i--) {
            System.out.print(vars[i] + " ");
        }
    }
}

情况2:只填充了前k个元素

那倒序的时候只遍历前k个元素的索引(从k-1到0),就不会打印后面的零了:

import java.util.Random;

public class EZD_printBackwards {
    static int vars[] = new int[10];
    static int filledCount = 6; // 只填充前6个元素

    public static void main(String[] args) {
        Random random = new Random();
        for (int i = 0; i < filledCount; i++) {
            vars[i] = random.nextInt(100);
        }

        // 只倒序打印已填充的元素
        System.out.println("倒序输出已填充的元素:");
        for (int i = filledCount - 1; i >= 0; i--) {
            System.out.print(vars[i] + " ");
        }
    }
}

避坑小贴士

  • 永远记住:Java数组的索引是从0开始的,最大索引是数组长度-1,超出这个范围就会触发越界异常。
  • 如果数组只填充了部分元素,一定要记录填充的数量,遍历的时候只操作已填充的索引范围,避免访问默认零值的位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:20:42