Java数组操作

193 阅读4分钟

在 Java 编程中,数组是最基础也最常用的数据结构之一。由于数组长度固定的特性,涉及元素的插入、删除等操作时需要特殊处理,无法像动态集合类那样直接操作

代码如下

public class Demo06 {
    public static void main(String[] args) {
        // 初始数组
        int[] arr = {11, 22, 33, 43, 54, 63, 27};
        // 测试查找方法(查找元素43)
        testFindElement(arr, 43);
        
        // 测试任务1:找到63,插入单个元素999
        int[] arrAfterInsertOne = insertOneElement(arr, 63, 999);
        System.out.println("\n任务1:插入单个元素后的数组:");
        printArray(arrAfterInsertOne);
        
        // 测试任务2:找到63,插入数组{1,2,3}
        int[] insertArr = {1, 2, 3};
        int[] arrAfterInsertArray = insertArrayElements(arr, 63, insertArr);
        System.out.println("\n任务2:插入数组后新数组:");
        printArray(arrAfterInsertArray);
        
        // 测试任务3:找到33,删除该元素
        int[] arrAfterDelete = deleteElement(arr, 33);
        System.out.println("\n任务3:删除元素后的数组:");
        printArray(arrAfterDelete);
    }

    // -------------------------- 基础功能:查找元素位置 --------------------------
    /**
     * 查找数组中指定元素的索引
     * @param arr 待查找的数组
     * @param ele 要查找的元素
     * @return 元素索引(存在则返回对应索引,不存在返回-1)
     */
    public static int findEle(int[] arr, int ele) {
        int pos = -1; // 默认值:未找到
        // 遍历数组,匹配元素
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == ele) {
                pos = i; // 找到元素,记录索引
                break; // 假设数组中无重复元素,找到后直接退出循环
            }
        }
        return pos;
    }

    // -------------------------- 任务1:插入单个元素 --------------------------
    /**
     * 找到指定元素后,在其后面插入1个新元素
     * @param arr 原数组
     * @param targetEle 目标元素(找到后在其后插入)
     * @param newEle 要插入的新元素
     * @return 插入后的新数组(原数组不变)
     */
    public static int[] insertOneElement(int[] arr, int targetEle, int newEle) {
        // 1. 查找目标元素的位置
        int targetPos = findEle(arr, targetEle);
        if (targetPos == -1) {
            System.out.println("任务1:未找到目标元素" + targetEle + ",返回原数组");
            return arr;
        }

        // 2. 创建新数组:长度 = 原长度 + 1(插入1个元素)
        int[] newArr = new int[arr.length + 1];
        
        // 3. 复制原数组元素到新数组
        for (int i = 0; i < arr.length; i++) {
            if (i <= targetPos) {
                // 目标元素及其之前的元素,直接复制
                newArr[i] = arr[i];
            } else {
                // 目标元素之后的元素,向后移1位(空出插入位置)
                newArr[i + 1] = arr[i];
            }
        }
        
        // 4. 在目标元素后面插入新元素(索引 = 目标索引 + 1)
        newArr[targetPos + 1] = newEle;
        
        return newArr;
    }

    // -------------------------- 任务2:插入另一个数组 --------------------------
    /**
     * 找到指定元素后,在其后面插入另一个数组的所有元素
     * @param arr 原数组
     * @param targetEle 目标元素(找到后在其后插入)
     * @param insertArr 要插入的数组
     * @return 插入后的新数组(原数组不变)
     */
    public static int[] insertArrayElements(int[] arr, int targetEle, int[] insertArr) {
        // 1. 查找目标元素的位置
        int targetPos = findEle(arr, targetEle);
        if (targetPos == -1) {
            System.out.println("任务2:未找到目标元素" + targetEle + ",返回原数组");
            return arr;
        }
        // 处理插入数组为空的情况
        if (insertArr == null || insertArr.length == 0) {
            System.out.println("任务2:插入数组为空,返回原数组");
            return arr;
        }

        // 2. 创建新数组:长度 = 原长度 + 插入数组长度
        int newArrLength = arr.length + insertArr.length;
        int[] newArr = new int[newArrLength];
        
        // 3. 复制原数组元素到新数组
        for (int i = 0; i < arr.length; i++) {
            if (i <= targetPos) {
                // 目标元素及其之前的元素,直接复制
                newArr[i] = arr[i];
            } else {
                // 目标元素之后的元素,向后移“插入数组长度”位
                newArr[i + insertArr.length] = arr[i];
            }
        }
        
        // 4. 插入目标数组(从“目标索引+1”开始)
        for (int i = 0; i < insertArr.length; i++) {
            newArr[targetPos + 1 + i] = insertArr[i];
        }
        
        return newArr;
    }

    // -------------------------- 任务3:删除指定元素 --------------------------
    /**
     * 找到指定元素后,将其从数组中删除
     * @param arr 原数组
     * @param targetEle 要删除的目标元素
     * @return 删除后的新数组(原数组不变;若未找到元素,返回原数组)
     */
    public static int[] deleteElement(int[] arr, int targetEle) {
        // 1. 查找目标元素的位置
        int targetPos = findEle(arr, targetEle);
        if (targetPos == -1) {
            System.out.println("任务3:未找到目标元素" + targetEle + ",返回原数组");
            return arr;
        }
        // 处理原数组只有1个元素的情况(删除后为空数组)
        if (arr.length == 1) {
            return new int[0];
        }

        // 2. 创建新数组:长度 = 原长度 - 1(删除1个元素)
        int[] newArr = new int[arr.length - 1];
        
        // 3. 复制原数组元素到新数组(跳过目标元素)
        int newArrIndex = 0; // 新数组的索引指针
        for (int i = 0; i < arr.length; i++) {
            if (i != targetPos) {
                // 不是目标元素,复制到新数组
                newArr[newArrIndex] = arr[i];
                newArrIndex++; // 新数组索引后移
            }
            // 是目标元素,直接跳过(不复制)
        }
        
        return newArr;
    }

    // -------------------------- 辅助方法:打印数组(便于调试) --------------------------
    /**
     * 打印数组内容(格式:[元素1, 元素2, ...])
     * @param arr 要打印的数组
     */
    public static void printArray(int[] arr) {
        if (arr == null || arr.length == 0) {
            System.out.println("[]");
            return;
        }
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
            if (i != arr.length - 1) {
                sb.append(", ");
            }
        }
        sb.append("]");
        System.out.println(sb.toString());
    }

    // -------------------------- 测试方法:验证查找功能 --------------------------
    public static void testFindElement(int[] arr, int ele) {
        System.out.println("测试查找功能:");
        int pos = findEle(arr, ele);
        if (pos == -1) {
            System.out.println("元素" + ele + "未在数组中找到");
        } else {
            System.out.println("元素" + ele + "的索引位置为:" + pos);
        }
    }
}

运行结果

测试查找功能:
元素43的索引位置为:3

任务1:插入单个元素后的数组:
[11, 22, 33, 43, 54, 63, 999, 27]

任务2:插入数组后新数组:
[11, 22, 33, 43, 54, 63, 1, 2, 3, 27]

任务3:删除元素后的数组:
[11, 22, 43, 54, 63, 27]