顺序表的原理:我们操作顺序表时,无非就是对顺序表的长度进行操作,例如我们删除顺序表一个元素时,要将顺序表长度 - 1,然而数组的真实长度并没有改变。又例如当我们打印顺序表时,必须是以顺序表的长度size操作,而不是以数组本身长度data.length操作,我们要牢记要拿着顺序表的长度size操作一切。
我们在MyArrayList类中存放顺序表的内容
public class MyArrayList {
public int[] data; //用数组存放数据
public int size; //顺序表长度
//size默认为0
public MyArrayList() {
//初始化分配5个能存放int类型数据的数组
this.data = new int[5];
}
}
再在该类中实现顺序表的相应方法
添加元素
//添加数据
public void add(int pos, int value) {
//若数组空间不够,即扩大两倍
if (this.size == this.data.length) {
this.data = Arrays.copyOf(this.data, this.data.length * 2);
}
if (pos < 0 || pos > this.size) {
System.out.println("位置不合法!");
return;
}
//元素后置
for (int i = this.size; i > pos; i--) {
this.data[i] = this.data[i - 1];
}
//pos位置赋值
this.data[pos] = value;
this.size++;
}
查找元素
//判断是否包含某个元素
public boolean contains(int value) {
for (int i = 0; i < this.size; i++) {
if (this.data[i] == value) {
return true;
}
}
return false;
}
查找元素对应的位置
public int search(int value) {
for (int i = 0; i < this.size; i++) {
if (value == this.data[i]) {
return i;
}
}
System.out.println("不存在该值!");
return -1;
}
获取指定位置的元素
//获取pos位置的元素
public int setPos(int pos) {
if (pos < 0 || pos >= this.size) {
System.out.println("pos位置不合法!");
return -1;
}
return this.data[pos];
}
将指定位置的元素设置成指定的值
//将pos位置的值设置成value
public void setPso(int pos, int value) {
if (pos < 0 || pos >= this.size) {
System.out.println("pos位置不合法!");
return;
}
this.data[pos] = value;
}
删除顺序表中第一次出现的指定关键字
//删除顺序表第一次出现的关键字key
public void remove(int key) {
int pos = -1;
for (int i = 0; i < this.size; i++) {
if (key == this.data[i]) {
//记录位置
pos = i;
}
}
if (pos == -1) {
System.out.println("没有key这个关键字");
}
//元素前置
for (int i = pos; i < this.data.length - 1; i++) {
this.data[i] = this.data[i + 1];
}
this.size--;
}
打印顺序表
//打印顺序表
public void print() {
for (int i = 0; i < this.size; i++) {
System.out.print(this.data[i] + " ");
}
}
获取顺序表长度
//获取顺序表长度
public int size() {
return this.size;
}
清空顺序表
//清空顺序表
public void clear() {
this.size = 0;
}
下面是代码部分
MyArrayList类
import java.util.Arrays; //copyOf方法的类声明
public class MyArrayList {
public int[] data; //用数组存放数据
public int size; //顺序表长度
//size默认为0
public MyArrayList() {
//初始化分配5个能存放int类型数据的数组
this.data = new int[5];
}
//添加数据
public void add(int pos, int value) {
//若数组空间不够,即扩大两倍
if (this.size == this.data.length) {
this.data = Arrays.copyOf(this.data, this.data.length * 2);
}
if (pos < 0 || pos > this.size) {
System.out.println("位置不合法!");
return;
}
//元素后置
for (int i = this.size; i > pos; i--) {
this.data[i] = this.data[i - 1];
}
//pos位置赋值
this.data[pos] = value;
this.size++;
}
//判断是否包含某个元素
public boolean contains(int value) {
for (int i = 0; i < this.size; i++) {
if (this.data[i] == value) {
return true;
}
}
return false;
}
//查找某个元素对应的位置
public int search(int value) {
for (int i = 0; i < this.size; i++) {
if (value == this.data[i]) {
return i;
}
}
System.out.println("不存在该值!");
return -1;
}
//获取pos位置的元素
public int getPos(int pos) {
if (pos < 0 || pos >= this.size) {
System.out.println("pos位置不合法!");
return -1;
}
return this.data[pos];
}
//将pos位置的值设置成value
public void setPso(int pos, int value) {
if (pos < 0 || pos >= this.size) {
System.out.println("pos位置不合法!");
return;
}
this.data[pos] = value;
}
//删除顺序表第一次出现的关键字key
public void remove(int key) {
int pos = -1;
for (int i = 0; i < this.size; i++) {
if (key == this.data[i]) {
//记录位置
pos = i;
}
}
if (pos == -1) {
System.out.println("没有key这个关键字");
}
//元素前置
for (int i = pos; i < this.data.length - 1; i++) {
this.data[i] = this.data[i + 1];
}
this.size--;
}
//打印顺序表
public void print() {
for (int i = 0; i < this.size; i++) {
System.out.print(this.data[i] + " ");
}
}
//获取顺序表长度
public int size() {
return this.size;
}
//清空顺序表
public void clear() {
this.size = 0;
}
}