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);
}
}