Java使用循环在数组头部插入元素不丢失末尾元素问题咨询
问题解决思路
错误根源
- Java中的数组是定长数据结构,你初始化
names数组时长度已经固定为5,最多只能存储5个元素,无法直接新增第6个元素 - 你当前的代码逻辑是将原有元素从后往前依次覆盖移位,最后一位的
Theresa会被前一位的值直接覆盖,所以会丢失;如果强行把n改成6,遍历的时候会访问到数组长度以外的下标,直接触发数组越界异常
修复方案(手写数组插入算法)
如果要保留手写算法的实现逻辑,需要先创建一个长度为原数组长度+1的新数组,再完成元素移位和插入操作,代码如下:
import java.util.Scanner; public class ArraySample1 { public static void main(String[] args) { String[] names = new String[] {"John", "Cecille", "Mark", "Judas", "Theresa"}; int n = names.length; System.out.println("The original array elements are: "); for(int i = 0; i < n; i++){ System.out.println("NAME[" + i + "] = " + names[i] + " "); } Scanner sc = new Scanner(System.in); System.out.print("Enter element to insert: "); String item = sc.next(); // 创建长度+1的新数组 String[] newNames = new String[n + 1]; // 新元素放到新数组头部 newNames[0] = item; // 原数组所有元素拷贝到新数组对应位置 for(int i = 0; i < n; i++){ newNames[i+1] = names[i]; } // 替换原数组引用 names = newNames; n = names.length; System.out.println("The array elements after insertion :"); for(int i = 0; i < n; i++) { System.out.println("NAME[" + i + "] = " + names[i] + " "); } } }
简化方案(使用Java集合类)
如果不需要手写底层算法,直接使用Java自带的可变长度集合ArrayList实现更简单,不需要手动处理数组扩容逻辑:
import java.util.ArrayList; import java.util.Scanner; public class ArraySample2 { public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add("John"); names.add("Cecille"); names.add("Mark"); names.add("Judas"); names.add("Theresa"); System.out.println("The original array elements are: "); for(int i = 0; i < names.size(); i++){ System.out.println("NAME[" + i + "] = " + names.get(i) + " "); } Scanner sc = new Scanner(System.in); System.out.print("Enter element to insert: "); String item = sc.next(); // 直接调用方法插入到下标为0的头部位置 names.add(0, item); System.out.println("The array elements after insertion :"); for(int i = 0; i < names.size(); i++) { System.out.println("NAME[" + i + "] = " + names.get(i) + " "); } } }
内容的提问来源于stack exchange,提问作者Mayayaya20
相关产品推荐
相关产品推荐

