package shuzu; /** * 通过数组实现类似于集合的功能 * 包含功能有: * * 动态添加元素 * 在指定位置添加元素 * * 删除指定下标的元素 * 删除指定内容的首个元素 * 删除指定内容的所有元素 * * 修改指定下标的元素 * * 查询指定元素的下标 * */ import java.util.Arrays; public class ArraysTest { static int[] arr = new int[5]; static int num = 0; public static void main(String[] args) { add(1); add(1); add(2); add(2); add(3); add(3); System.out.println("扩容: " + Arrays.toString(arr)); add(5, 5); System.out.println("指定位置扩容: " + Arrays.toString(arr)); delete(5); System.out.println("删除指定位置后的数组为: " + Arrays.toString(arr)); deleteContent(1); System.out.println("删除指定内容的元素的数组为: " + Arrays.toString(arr)); deleteContentAll(3); System.out.println("删除指定内容的所有元素的数组为: " + Arrays.toString(arr)); update(5, 10); query(3); } // 添加元素 public static void add(int ele) { if (num >= arr.length) { arr = doArr(); } arr[num] = ele; num++; } // 在指定位置添加元素 public static void add(int index, int ele) { if (index < arr.length) { arr = doArr(index, ele); } else { System.out.println("数组越界!"); } } // 删除指定位置元素 public static void delete(int index) { if (index < arr.length) { doCut(index); } } // 删除数组中首次出现的指定内容元素 public static void deleteContent(int ele) { for (int i = 0; i < arr.length; i++) { if (arr[i] == ele) { doCut(i); break; } } } // 删除指定内容的所有元素 public static void deleteContentAll(int ele) { for (int i = 0; i < arr.length; i++) { if (arr[i] == ele) { doCut(i); i = 0; } } } // 修改指定位置的元素内容 public static void update(int index, int ele) { if (index < arr.length) { arr[index] = ele; } else { System.out.println("数组越界!"); } } // 查询指定的元素内容的首次位置,并显示 public static void query(int ele) { for (int i = 0; i < arr.length; i++) { if (arr[i] == ele) { System.out.println(ele + "所在的下标为" + i); break; } if ((i == arr.length - 1) && (arr[i] != ele)) { System.out.println(ele + "不在当前所在的数组"); } } } // 数组扩容 动态扩容 public static int[] doArr() { int[] arr_ = new int[arr.length + 1]; // arr.length * (3/2)+1 是怎么想的 arr_ = Arrays.copyOf(arr, arr_.length); return arr_; } // 数组扩容 动态指定位置扩容 public static int[] doArr(int index, int ele) { int[] arr_ = new int[arr.length + 1]; arr_ = Arrays.copyOf(arr, arr_.length);// 复制给新数组 for (int i = arr_.length - 1; i >= index; i--) {// 指定位置的元素后移 arr_[i] = arr_[i - 1]; } arr_[index] = ele; return arr_; } // 数组缩减 动态缩减 public static void doCut(int index) { // 根据指定的序号进行响应的缩减 // 平移覆盖思想 for (int i = index; i < arr.length - 1; i++) { arr[i] = arr[i + 1]; } arr = Arrays.copyOf(arr, arr.length - 1); } }