文章目录
顺序表
顺序表的定义
顺序表是线性表的一种
所谓线性表指一串数据的组织存储在逻辑上是线性的,而在物理上不一定是线性的
顺序表的底层实现是数组,其由一群数据类型相同的元素组成,其在逻辑与物理上均是线性的。
代码实现:
创建一个顺序表的类
在java中是将顺序表实现为一个类,所有与顺序表相关的属性与方法封装在这个类里面,这与c语言实现顺序表不同
public class MyArrayList {
private int [] array ;
//记录当前顺序表中使用的空间的个数
int usedsize = 0;
//所有空间的个数,spacesize,默认为10
public static final int DEFAULT_SIZE = 10;
int spacesize =DEFAULT_SIZE ;
public MyArrayList() {
this.array = new int[DEFAULT_SIZE];
}
}
在顺序表中增加一条新的数据
public void add(int data) {
//先保证空间足够
spaceextends();
array[usedsize++] = data;
}
在顺序表中增加一条数据时,首先需要判断空间是否足够,如果不够,则需要扩容,我们把这一步骤专门封装成一个方法:
private void spaceextends(){
if(spacesize>usedsize){
return ;
}else {
//调用数组本身的方法,使其扩展两倍
this.array = Arrays.copyOf(this.array, this.array.length * 2);
spacesize = spacesize * 2;
return ;
}
}
展示顺序表中内容
public void display() {
//展示顺序表中的元素
for (int i = 0; i < usedsize; i++) {
System.out.print(array[i]+" ");
}
}
测试一下:
public class Test {
public static void main(String[] args) {
MyArrayList arrayList = new MyArrayList();
arrayList.add(5);
arrayList.add(6);
arrayList.add(10);
arrayList.add(9);
arrayList.display();
}
}
在pos位置处插入一条数据
在pos位置处插入一条数据,则需要pos位置以及其后的数据全部向右移动一位
然后再在pos位置插入数据。
- 存在pos是否合法的问题,pos不能为负数,且pos的位置之前必须有元素(比如设置pos为200,但是数组中存放元素的下标只到5,那么中间195个位置均浪费掉了,所以要求pos之前必须有元素)
- 空间是否足够的问题,,需要调用我们之前定义的方法
public void pos(int pos ,int data) {
if (pos>usedsize|| pos<0){
throw new PosworongfulException("pos位置异常");
}else {
spaceextends();
//下面的语句也符号usedsize==pos时
for (int i = usedsize;i>=pos ;i--) {
array[i] = array[i-1];
}
array[pos] = data;
usedsize++;
}
}
测试:
public class Test {
public static void main(String[] args) {
MyArrayList arrayList = new MyArrayList();
arrayList.add(5);
arrayList.add(6);
arrayList.add(10);
arrayList.add(9);
try {
arrayList.pos(1,5);//在1位置插入5
}catch (PosworongfulException e){
e.printStackTrace();
}
arrayList.display();
}
}
测试:在-1位置插入10
public class Test {
public static void main(String[] args) {
MyArrayList arrayList = new MyArrayList();
arrayList.add(5);
arrayList.add(6);
arrayList.add(10);
arrayList.add(9);
try {
arrayList.pos(-1,10);
}catch (PosworongfulException e){
e.printStackTrace();
}
arrayList.display();
}
}
判断顺序表中是否包含指定的数据
public boolean contains(int toFind) {
//判断是否包含指定的数据
//需要遍历整个顺序表
for (int i = 0; i < usedsize; i++) {
if (array[i] == toFind){
return true ;
}
}
return false;
}
public class Test {
public static void main(String[] args) {
MyArrayList arrayList = new MyArrayList();
arrayList.add(5);
arrayList.add(6);
arrayList.add(10);
arrayList.add(9);
System.out.println(arrayList.contains(20));
System.out.println(arrayList.contains(5));
arrayList.display();
}
查找某个数据在顺序表中的位置
public int indexof(int toFind) {
//判断某个元素对应的位置
//依然需要查找顺序表
for (int i = 0; i < usedsize; i++) {
if (array[i] ==toFind){
//找到了返回i ,没找到返回-1
return i;
}
}
return -1;
}
public class Test {
public static void main(String[] args) {
MyArrayList arrayList = new MyArrayList();
arrayList.add(5);
arrayList.add(6);
arrayList.add(10);
arrayList.add(9);
System.out.println(arrayList.indexof(5));
System.out.println(arrayList.indexof(9));
System.out.println(arrayList.indexof(20));
//arrayList.display();
}
}
获取pos位置的元素
public int get(int pos) {
//获取pos位置的元素
//先判断pos 合不合法,是否小于usedsize
if(pos >=usedsize||pos<0){
System.out.println("输入的pos不合法");
throw new PosworongfulException("Pos位置不合法");
}else {
return array[pos];
}
}
public class Test {
public static void main(String[] args) {
MyArrayList arrayList = new MyArrayList();
arrayList.add(5);
arrayList.add(6);
arrayList.add(10);
arrayList.add(9);
try {
System.out.println(arrayList.get(1));
System.out.println(arrayList.get(10));
} catch (PosworongfulException e) {
e.printStackTrace();
}
}
}
将pos位置的元素改为value
public void setValue(int pos, int value) {
//将pos位置的值改为value
//也需要判断pos位置合不合法
if(pos >=usedsize||pos<0){
System.out.println("输入的pos不合法");
throw new PosworongfulException("Pos位置不合法");
}else {
array[pos] = value;
}
}
测试:
public class Test {
public static void main(String[] args) {
MyArrayList arrayList = new MyArrayList();
arrayList.add(5);
arrayList.add(6);
arrayList.add(10);
arrayList.add(9);
arrayList.display();
System.out.println();
try {
arrayList.setValue(1,10);
arrayList.setValue(10,5);
} catch (PosworongfulException e) {
e.printStackTrace();
}
arrayList.display();
}
}
删除顺序表中第一个出现的数据
public void remove(int toFind) {
//删除第一次出现的关键字key
//先判断此元素在数组中的下标
int ret = this.indexof(toFind);
if(ret ==-1){
System.out.println("没有这个数字");
}
else {
//将ret下标之后的数据往左移动一位
for (int i = ret; i < usedsize-1; i++) {
this.array[i] = this.array[i+1];
}
this.usedsize--;
}
}
测试:
package demo1;
public class Test {
public static void main(String[] args) {
MyArrayList arrayList = new MyArrayList();
arrayList.add(5);
arrayList.add(6);
arrayList.add(10);
arrayList.add(9);
arrayList.display();
System.out.println();
arrayList.remove(5);
arrayList.remove(20);
arrayList.display();
}
}
清空顺序表:
public void clear() {
//清空顺序表
//对于基本数据类型则将usedsize置为0即可,因为我们是根据usedsize对数组进行操作的
//usedsize为0,相当于顺序表为空,如果顺序表数据类型为引用数据类型,则需要将每个数组元素
//置为null
this. usedsize = 0;
}