数组打印多余零、倒序打印异常及首元素零问题求助
你的两个数组问题解决方案
嘿,咱一步步拆解你遇到的两个问题,结合你描述的现象和代码场景来给你捋清楚:
一、去除数组末尾的多余零
你说的“所有元素列出后出现的多余零”,应该是指数组初始化时长度比实际填充的有效元素长,剩下的默认零值对吧?比如创建了长度为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)); } }
二、倒序打印数组的问题分析与解决
你遇到的三个现象:打印第一个元素是零、额外输出零、修改循环触发数组越界,其实根源都是数组索引操作错误和未填充完全数组导致的,咱一个个说:
问题原因拆解
- 打印第一个元素是零:倒序打印的第一个元素是原数组的最后一个位置(索引
vars.length-1),如果这个位置没被你填充随机数,int数组的默认值就是0,所以第一个打出来的就是0。 - 额外输出零:和上面同理,你打印了数组中那些没被填充的位置,这些位置都是默认的0。
- 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
相关产品推荐
相关产品推荐

