小编给大家分享一下如何使用Java实现顺序表的操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
具体内容如下
静态顺序表:使用定长数组存储。
动态顺序表:使用动态开辟的数组存储。
接口
package com.github.sqlist;public interface ISequence { // 在 pos 位置插入 val boolean add(int pos, Object data); // 查找关键字 key 找到返回 key 的下表,没有返回 -1 int search(Object key); // 查找是否包含关键字 key 是否在顺序表当中(这个和search有点冲突) boolean contains(Object key); // 得到 pos 位置的值 Object getPos(int pos); // 删除第一次出现的关键字 key Object remove(Object key); // 得到顺序表的长度 int size(); // 打印顺序表 void display(); // 清空顺序表以防内存泄漏 void clear();}
实现接口里的每个方法
package com.github.sqlist;import java.util.Arrays;public class MySequenceImpl implements ISequence { private Object[] elem; // 有效数据个数 private int usedSize; private static final int DEFAULT_SIZE = 10; public SqList() { this.elem = new Object[DEFAULT_SIZE]; this.usedSize = 0; } private boolean isFull() { return this.elem.length == this.usedSize; } @Override public boolean add(int pos, Object data) { // 1. 判断pos位置的合法性 if (pos < 0 || pos > this.elem.length) { return false; } // 2. 判断是否满了,如果满了进行扩容 if (isFull()) { this.elem = Arrays.copyOf(this.elem, 2*this.elem.length); } // 3. 把pos位置以及之后的数全部向后挪一个位置 for (int i = this.usedSize-1; i >= pos; i--) { this.elem[i+1] = this.elem[i]; } // 4. 在 pos 位置插入 val this.elem[pos] = data; // 5. 更新长度 this.usedSize++; return true; } private boolean isEmpty() { return this.usedSize == 0; } @Override public int search(Object key) { // 1. 判断是否为空 if (isEmpty()) { return -1; } // 2. 遍历查找 for (int i = 0; i < this.elem.length; i++) { // 注意:判断条件不能写成:this.elem[i] == key if (this.elem[i].equals(key)) { return i; } } return -1; } @Override public boolean contains(Object key) { // 1. 判断是否为空 if (isEmpty()) { return false; } // 2. 遍历查找 for (int i = 0; i < this.elem.length; i++) { // 注意:判断条件不能写成:this.elem[i] == key if (this.elem[i].equals(key)) { return true; } } return false; } @Override public Object getPos(int pos) { // 1. 判断位置是否合法 if (pos<0 || pos>=this.elem.length) { return null; } // 2. 位置合法 return this.elem[pos]; } @Override public Object remove(Object key) { // 1. 先查表看有没有这个关键字 // index:关键字下标 int index = search(key); // 2. 若表里没有这个关键字 if (index == -1) { return null; } // 3. 表里有这个关键字 Object data = this.elem[index]; int i; // 删除第一次出现的关键字 key,把key后面的数全部向前挪一个位置 for (i = index; i < this.usedSize; i++) { elem[i] = elem[i+1]; } this.usedSize--; this.elem[i+1] = null; return data; } @Override public int size() { return this.usedSize; } @Override public void display() { for (int i = 0; i < this.usedSize; i++) { System.out.print(this.elem[i] + " "); } System.out.println(); } @Override public void clear() { for (int i = 0; i < this.usedSize; i++) { this.elem[i] = null; } }}
测试方法的正确性
package com.github.sqlist;public class TestDemo1 { public static void main(String[] args) { MySequenceImpl mySequence = new MySequenceImpl(); for (int i = 0; i < 10; i++) { mySequence.add(i,i); } System.out.println("在最大值10的范围内插入数据:"); mySequence.display(); System.out.println(); for (int i = 10; i < 20; i++) { mySequence.add(i,i); } System.out.println("扩容:"); mySequence.display(); System.out.println(); System.out.println("随机位置插入数据:"); mySequence.add(9,"list"); mySequence.display(); System.out.println(); System.out.println("search查找一个数据:"+mySequence.search("list")); System.out.println("contains查找一个数据:"+mySequence.contains("list")); System.out.println(); System.out.println("查找某一个位置对应的值:"+mySequence.getPos(9)); System.out.println(); System.out.println("删除一个数据:"+mySequence.remove(8)); mySequence.display(); System.out.println(); System.out.println("得到顺序表的长度:"+mySequence.size()); }}
测试结果:
以上是“如何使用Java实现顺序表的操作”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!