文章目录
目录
前言
本章开始记录Java数据结构的学习过程,之前也有过数据结构的学习,现在想来是远远不够的,没有系统化的学习,现在从这里开始系统化的总结和分享Java数据结构的学习。
一、顺序表简介
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
二、顺序表实现
1.接口的实现
为了实现顺序表,接下来对部分方法进行实现。代码如下(示例):
public class SeqList {
private int[] array;//待使用的顺序表
private int size;//计算顺序表存入的数据
SeqList(){
//无参构造方法
}
SeqList(int initcapacity) {
//有参构造方法,设置初始化的顺序表大小
}
// 新增元素,默认在数组最后新增
public void add(int data) { }
// 在 pos 位置新增元素
public void add(int pos, int data) { }
// 判定是否包含某个元素
public boolean contains(int toFind) { return true; }
// 查找某个元素对应的位置
public int indexOf(int toFind) { return -1; }
// 获取 pos 位置的元素
public int get(int pos) { return -1; }
// 给 pos 位置的元素设为 value
public void set(int pos, int value) { }
//删除第一次出现的关键字key
public void remove(int toRemove) { }
// 获取顺序表长度
public int size() { return 0; }
// 清空顺序表
public void clear() { }
}
2.方法具体实现
2.1构造方法
首先对于构造方法来说,有无参的构造方法,有有参的构造方法,有参的构造方法自定义顺序表的大小。代码如下(示例):
SeqList(){
//无参构造方法
this.array = new int[10];//默认大小为10
}
SeqList(int initcapacity) {
//有参构造方法,设置初始化的顺序表大小
this.array = new int[initcapacity];//自定义大小
}
2.2 增加元素
// 新增元素,默认在数组最后新增
public void add(int data) {
//判断是否顺序表是否满了
if (isFull()) {
//满了2倍扩容
this.array = Arrays.copyOf(this.array,2*this.array.length);
}
this.array[size] = data;
this.size++;
}
// 在 pos 位置新增元素
public void add(int pos, int data) {
if (isFull()) {
this.array = Arrays.copyOf(this.array,2*this.array.length);
}
//判断插入位置是否合法
if (pos < 0 || pos > this.size + 1) {
//不合法抛出自定义异常
throw new CheckPosInAddException("插入位置不合法");
}
for (int i = size; i > pos - 1; i--) {
array[i] = array[i-1];//先将插入位置后面的数据右移
}
//注意插入位置和下标的区别
this.array[pos-1] = data;
this.size++;
}
private boolean isFull() {
return size == array.length;
}
2.3 判断是否包含某个元素并返回对应的位置
// 判定是否包含某个元素
public boolean contains(int toFind) {
for (int i = 0; i < this.size; i++) {
if (this.array[i] == toFind) {
return true;
}
}
return false;
}
// 查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i < this.size; i++) {
if(this.array[i] == toFind) {
return i;//返回对应的下标位置
}
}
throw new CheckPosInAddException("该元素不存在");
}
2.4获取对应位置元素、更改对应位置元素值
// 获取 pos 位置的元素
public int get(int pos) {
if(pos <0 || pos > this.size) {
throw new CheckPosInAddException("查找位置不合法");
}
return this.array[pos-1];
}
// 给 pos 位置的元素设为 value
public void set(int pos, int value) {
if(pos <0 || pos > this.size) {
throw new CheckPosInAddException("位置不合法");
}
this.array[pos-1] = value;
}
2.5删除操作、获取顺序表长度
//删除第一次出现的关键字key
public void remove(int key) {
//第一遍遍历寻找该元素
for (int i = 0; i < this.size; i++) {
if (array[i] == key) {
//找到之后,将后面的元素对前面的进行覆盖
for (int j = i; j < this.size - 1; j++) {
array[j] = array[j+1];
}
size--;
return;//只删除第一次出现的,故结束
}
}
//没有这个关键字就抛出异常
throw new CheckPosInAddException("不存在该关键字");
}
// 获取顺序表长度
public int size() {
return this.size;
}
// 清空顺序表
public void clear() {
this.size = 0;//将顺序表长度置为0也就代表顺序表清空了
}
三、 ArrayList使用
1.使用ArrayList
Java中已经有对用的顺序表对象了,我们只需要会调用就行了,并不用自己一个一个实现
public static void main(String[] args) {
// ArrayList创建,推荐写法
// 构造一个空的列表
List<Integer> list1 = new ArrayList<>();
// 构造一个具有10个容量的列表
List<Integer> list2 = new ArrayList<>(10);
list2.add(1);
list2.add(2);
list2.add(3);
// list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素
// list3构造好之后,与list中的元素一致
ArrayList<Integer> list3 = new ArrayList<>(list2);
// 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难
List list4 = new ArrayList();
list4.add("111");
list4.add(100);
}
接下来展示Java中ArrayList的常用方法:
方法 | 解释 |
boolean add(E e) | 尾插 e |
void add(int index, E element) | 将 e 插入到 index 位置 |
boolean addAll(Collection<? extends E> c) | 尾插 c 中的元素 |
E remove(int index) | 删除 index 位置元素 |
boolean remove(Object o) | 删除遇到的第一个 o |
E get(int index) | 获取下标 index 位置元素 |
E set(int index, E element) | 将下标 index 位置元素设置为 element |
void clear() | 清空 |
boolean contains(Object o) | 判断 o 是否在线性表中 |
int indexOf(Object o) | 返回第一个 o 所在下标 |
int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
List<E> subList(int fromIndex, int toIndex) | 截取部分 lis |
2.ArrayList的遍历
对于顺序表的遍历,可以使用for循环+下标、foreach、使用迭代器,这三种方法也是常见的数组遍历的方法。
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 使用下标+for遍历
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
// 借助foreach遍历
for (Integer integer : list) {
System.out.print(integer + " ");
}
System.out.println();
//使用迭代器
Iterator<Integer> it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
}
总结
至此,对于顺序表的总结就结束了,本文主要是了解其核心的思想并没有完全实现全部。如果有进一步的学习需求,需要去看jdk文档。