一、构建Arraylist基本属性
1.模拟ArrayList我们基于数组方式实现
2.我们设置Arraylist的初始空间大小为10
3.我们用usedSize记录数组元素个数
二、模拟实现Arraylist中的各种方法
1.打印顺序表
2.判断数组是否为满的
3.实现Arraylist尾插功能
注意:如果尾插时是满的话需要先扩容
4.在指定位置pos插入数据data
注意:
4.1在插入数据前数组是否为满的,是的话需要扩容
4.2在插入数据前需要判断位置是否合法
5.判断是否包含某元素
6.找到某元素的对应位置,没找到返回-1;
7.获取某pos位置的元素
注意:
7.1需先判断pos是否合法
7.2判断该数组是否为空数组
8.给pos位置元素更新为value
9.删除第一次出现是关键字key
10.获取链表长度
11.清空顺序表
三、模拟运行MyArraylist主要方法
运行结果:
四、完整代码
MyArraylist:
import java.lang.reflect.Array;
import java.util.Arrays;
public class MyArraylist<len> {
public int[] elem;
public int usedSize;//0
//默认容量
private static final int DEFAULT_SIZE = 10;
public MyArraylist() {
this.elem = new int[DEFAULT_SIZE];
}
/**
* 打印顺序表:
* 根据usedSize判断即可
*/
public void display() {
for (int i = 0; i < this.usedSize; i++) {
System.out.print(this.elem[i]+" ");
}
}
// 新增元素,默认在数组最后新增
public void add(int data) {
if (isFull()) {
this.elem = Arrays.copyOf(elem, elem.length * 2);
}
this.elem[this.usedSize] = data;
this.usedSize++;
}
/**
* 判断当前的顺序表是不是满的!
*
* @return true:满
*/
public boolean isFull() {
if (elem.length == usedSize) {
return true;
}
return false;
}
private boolean checkPosInAdd(int pos) {
if (pos < 0 || pos > this.elem.length) {
return true;
}
return false;//合法
}
// 在 pos 位置新增元素
public void add(int pos, int data) {
if (isFull()) {
this.elem = Arrays.copyOf(elem, elem.length * 2);
}
if (checkPosInAdd(pos)) {
System.out.println("位置不合法");
}
for (int i = usedSize - 1; pos <= i; i--) {
elem[i + 1] = elem[i];
elem[pos] = data;
usedSize++;
}
}
// 判定是否包含某个元素
public boolean contains(int toFind) {
for (int i = 0; i < usedSize; i++) {
if (toFind == this.elem[i]) {
return true;
}
}
return false;
}
// 查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i < usedSize; i++) {
if (toFind == this.elem[i]) {
return i;
}
}
return -1;
}
// 获取 pos 位置的元素
public int get(int pos) {
if (checkPosInAdd(pos)) {
System.out.println("位置不合法");
}
if (isEmpty()){
System.out.println("该数组为空数组");
}
return this.elem[pos];
}
private boolean isEmpty() {
return usedSize == 0;
}
// 给 pos 位置的元素设为【更新为】 value
public void set(int pos, int value) {
if (checkPosInAdd(pos)) {
System.out.println("数据不合法");
}
if (isEmpty()) {
System.out.println("该数组为空");
}
this.elem[pos] = value;
}
/**
* 删除第一次出现的关键字key
*
* @param key
*/
public void remove(int key) {
if (isEmpty()) {
System.out.println("该数组为空");
}
int getpos = indexOf(key);//找到该元素位置
if (getpos == -1) {
System.out.println("该数组没有该元素");
}
int i = getpos;
for (; i < usedSize - 1; i++) {
elem[i] = elem[i + 1];
}
usedSize--;
}
// 获取顺序表长度
public int size() {
return usedSize;
}
// 清空顺序表
public void clear() {
for (int i = 0; i < usedSize - 1; i++) {
this.elem[i] = 0;
}
usedSize = 0;
}
}
test:
public class test{
public static void main(String[] args) {
MyArraylist myArraylist=new MyArraylist();
myArraylist.add(1);//给数组添加元素,默认尾插
myArraylist.add(2);
myArraylist.add(3);
myArraylist.display();//尾插后得初始数组
System.out.println("\n---------------");
myArraylist.add(2,5);//在pos下标插入元素5
myArraylist.display();
System.out.println("\n---------------");
System.out.println(myArraylist.indexOf(5));//得到元素5的下标
System.out.println("\n---------------");
System.out.println(myArraylist.isFull());//判断数组是否为空
System.out.println("\n---------------");
myArraylist.remove(5);//删除该数组第一次出现的元素5
myArraylist.display();
}
}