如何基于源数组创建更短的目标数组?Java代码问题求助
你的代码存在这些核心问题,咱们逐个分析:
1. 数组长度逻辑完全搞反了
你需要存储i个有效姓名,那目标数组nomes的长度应该是i,而不是10-i。虽然当i=5时10-i=5刚好凑对,但这只是巧合——逻辑上你需要的是能容纳i个元素的数组,而不是源数组剩下的空位数量。如果i=3,10-i=7,你会得到一个长度为7的数组,后面4个位置都是null,完全不符合你的目标。
2. 赋值逻辑错误+数组越界风险
你当前的代码只执行了nomes[i] = nomeCompleto[i];,这有两个严重问题:
- 数组越界:如果
nomes长度是10-i,那它的最大索引是(10-i)-1,而i肯定大于这个值(比如i=5,最大索引是4,nomes[5]直接抛出ArrayIndexOutOfBoundsException)。 - 只复制了一个元素:你没有遍历所有有效姓名的索引(0到i-1),只会给目标数组的某一个位置赋值,其他位置都是
null,根本得不到你想要的完整姓名列表。
3. 未处理源数组的终止标记fim
你的源数组用fim作为有效元素的结束信号,但当前代码完全没判断这个。如果外部传入的i值不准确(比如多算了或者少算了),代码就会出错。理想情况下,代码应该能自己识别fim来确定有效元素的数量,而不是依赖外部的i。
修正后的代码示例
情况1:已经确定i是正确的有效姓名数量
String[] nomeCompleto = new String[10]; // 假设这里已经给nomeCompleto赋值了你的源数组内容 // 初始化长度为i的目标数组,刚好容纳所有有效姓名 String[] nomes = new String[i]; // 循环复制每个有效元素 for (int j = 0; j < i; j++) { nomes[j] = nomeCompleto[j]; } System.out.println(Arrays.toString(nomes)); return;
情况2:需要自动识别fim来确定有效元素数量(更健壮)
String[] nomeCompleto = {"Maria Carolina", "Luisa Joana", "Lara Silva", "Catarina Patricio", "Paula Castro", "fim", null, null, null, null}; // 先遍历源数组,找到"fim"或null的位置,统计有效姓名数量 int validCount = 0; while (validCount < nomeCompleto.length && nomeCompleto[validCount] != null && !"fim".equals(nomeCompleto[validCount])) { validCount++; } // 初始化目标数组并复制元素 String[] nomes = new String[validCount]; for (int j = 0; j < validCount; j++) { nomes[j] = nomeCompleto[j]; } System.out.println(Arrays.toString(nomes)); return;
这段代码会自动跳过fim及之后的null,精准提取你需要的有效姓名列表。
内容的提问来源于stack exchange,提问作者Ruca
相关产品推荐
相关产品推荐

