数组在开发中是必不可少、不可或缺的重要组成元素。在 Java 数据结构中,数组也被赋予神圣的地位。但是你真的会数组吗?那今天换个姿势,我们来怼一怼数据结构中的数组。
数组可以直接使用的方法不多,遍历便是最简单的一种使用。
数组遍历比较简单,简单粗暴的使用 for 循环遍历是最简单的事情,当然也可以使用 foreach 遍历。如下:
public static void main(String[] args) {
// 定义一个长度为3的数组,并初始化
int[] arr = new int[] {9, 8, 7};
// for 循环遍历该数组
for(int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
// 使用 java.util.Arrays.toString() 打印
System.out.println(Arrays.toString(arr));
// 使用forwach 遍历
for (int i : newArr) {
// 打印
System.out.print(i + "\t");
}
System.out.println();
}
学过数组的人都知道,数组的长度是固定的,初始化之后就不能再改变他的长度。但是在日常开发中,经常会对数组进行添加元素,删除元素,查找元素等等,这些 Java 数组都是没有方法实现的,但是 Java 中集合衍生出来的 ArrayList ,LinkList 这些可以是实现上述的功能。既然数组没有,那么下面就搞一下。
总体思路就是,封装一个数组的类,实现增删改查的功能。先实现必要的封装,如下:
/**
* 创建 MyArray 类,定义原始数组,并初始化
*/
public class MyArray {
// 定义一个数组
private int[] elements;
// 构造函数
public MyArray() {
super();
// 初始化数组,长度为零
this.elements = new int[0];
}
}
元素的添加,这一块主要是在数组末尾添加一个元素,在指定位置插入一个元素。
/***
* 往数组中末尾添加一个元素
*
* @param element 待添加的元素
*/
public void add(int element) {
int[] newArr = new int[elements.length + 1];
for (int i = 0; i < elements.length; i++) {
newArr[i] = elements[i];
}
newArr[elements.length] = element;
this.elements = newArr;
}
/**
* 指定位置插入元素
*
* @param index 待位置
* @param element 待插入元素
*/
public void insert(int index, int element) {
// 健壮性检查
if (index < 0 || index > elements.length) {
// 抛出异常
throw new RuntimeException("插入数组下标越界!");
}
int[] newArr = new int[elements.length + 1];
for (int i = 0; i < elements.length; i++) {
if (index > i) {
newArr[i] = elements[i];
} else {
newArr[i + 1] = elements[i];
}
}
newArr[index] = element;
elements = newArr;
}
删这一部分,主要是删除指定下标位置上的元素功能
/**
* 删除数组中的元素
*
* @param index 待删除元素的索引
*/
public void delete(int index) {
if (index > elements.length - 1 || index < 0) {
throw new RuntimeException("删除数组下标越界!");
}
int[] newArr = new int[elements.length - 1];
for (int i = 0; i < elements.length; i++) {
if (i < index) {
newArr[i] = elements[i];
}
if (i > index) {
newArr[i - 1] = elements[i];
}
}
elements = newArr;
}
查询元素这一部分主要是由元素索引查询、线性查询、二分查询等功能。
这个功能十分简单,只需要把对应索引的值返回便可,就不展开阐述了,直接贴代码。
/**
* 返回对应下标的元素值
*
* @param index 下标
* @return 对应元素的值
*/
public int get(int index) {
if (index > elements.length || index < 0) {
throw new RuntimeException("获取数组下标越界!");
}
return elements[index];
}
/**
* 线性查找
*
* @param target 待查找的元素
* @return 该元素的位置
*/
public int search(int target) {
for (int i = 0; i < elements.length; i++) {
if (target == elements[i]) {
return i;
}
}
return -1;
}
二分查找有个特殊的要求,需要该数组的升序、降序排列的。这里使用升序。
/**
* 二分查找
*
* @param target 查找元素的值
* @return 对应元素的下标
*/
public int binarySearch(int target) {
int begin = 1;
int end = elements.length - 1;
int mid = (begin + end) / 2;
int index = -1;
while (true) {
if (target > elements[elements.length - 1] || target < elements[0]) {
break;
}
if (target == elements[mid]) {
index = mid;
break;
} else {
if (target > elements[mid]) {
begin = mid + 1;
} else {
end = mid - 1;
}
mid = (begin + end) / 2;
}
}
return index;
}
修改数组这部分功能,主要包含替换元素值功能
这个功能也是相对简单,直接给需要替换的元素对应的下标的的便可。直接贴代码。
/**
* 替换数组指定位置元素
*
* @param index 位置
* @param element 元素
*/
public void replace(int index, int element) {
if (index < 0 || index > elements.length) {
throw new RuntimeException("替换插入数组下标越界!");
}
elements[index] = element;
}
再写几个常用的工具,包括遍历所有元素、获取该数组的长度。这部分功能比较简单,不展开阐述了。详细见下。
/**
* 打印所有元素到控制台
*/
public void printAllElements() {
System.out.println(Arrays.toString(elements));
}
/**
* 获取数组长度
*
* @return 数组长度
*/
public int size() {
return elements.length;
}
上述就是,Java 关于数组的主要内容了。总的来看,上述内容就是自己实现 ArrayLiat 这个类的常见功能,关键是重温下对数组的使用,还有部分的算法实现(二分查找)。
THE END