目录
一、 线性表
二、 顺序表
三、 ArrayList的简介
四、 ArrayList使用
五、自我实现ArrayList
一、线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
二、顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
三、ArrayList简介
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
四、 ArrayList使用
ArrayList 虽然提供的方法比较多,但是常用方法如下所示,需要用到其他方法时,同学们自行查看 ArrayList 的帮助文档。
五、自我实现ArrayLis
【主要方法】
// 新增元素,默认在数组最后新增
public void add(int data);
// 在 pos 位置新增元素
public void add(int pos, int data);
// 判定是否包含某个元素
public boolean contains(int toFind);
// 查找某个元素对应的位置
public int indexOf(int toFind);
// 获取 pos 位置的元素
public int get(int pos);
// 给 pos 位置的元素设为 value
public void set(int pos, int value);
//删除第一次出现的关键字key
public void remove(int toRemove);
// 获取顺序表长度
public int size() ;
// 清空顺序表
public void clear();
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public void display() ;
首先我们在 MyArray 类中定义一个 array 数组和 size(用来记录数组中含有的元素个数),以及一个构造方法,用来初始化数组。
public class MyArray implements IList{
private int[] array;
private int size;
// 默认构造方法
private final int initcapacity=10;
public MyArray(){
this.array=new int[initcapacity];
}
}
1、新增元素,默认在数组最后新增
如下代码,我们上传一个整形 data 用于放在数组的最后,size 表示数组中含有元素的个数,也是我们要放入元素的下标,最后使数组个数加一即可。
public void add(int data) {
array[size]=data;
this.size++;
}
如果这样写我们就错啦!我们学习数据结构需要明白:
(1) 数据结构虽然抽象一些,但也得有大概的结构
(2)逻辑需要非常严谨(也就是看似很简单,但写出来代码可能一大堆)
所以,上述代码并不严谨,如果我们传入一个满元素的数组呢,那么新增的元素不就没内存了嘛,也就是无处安放,也就是开会喊了你,但你过去才发现,会议桌周围以及坐满了人,此时我们应该坐哪里?
此时,大家会想到,我们或许可以在增加元素之前先对数组进行判满,如果没满我们可以直接“入座”,如果满了,我们就“找一些椅子”,给它扩充一下!具体实现如下:
//扩大数组的长度
private void grow(){
this.array= Arrays.copyOf(this.array,2*this.array.length);
}
// 新增元素,默认在数组最后新增
public boolean isFull(){
return this.size== array.length;
}
public void add(int data) {
if(isFull()){
grow();
this.size++;
}
array[size]=data;
this.size++;
}
先进行判断,如果 isFull() 返回的为 true 说明数组满了,我们就调用 grow() 成员方法对数组进行扩容,最后将新增的数据放在下标为 size 位置即可。
2、在指定位置新增元素
如下数组:
此时我们还是需要判断数组是否满元素,否则无法插入新元素,但是要注意,与第一个方法不同的是,我们还需另外判断一个东西,对!就是输入的下标 pos 是否合法?
private void checkpos(int pos) throws PosIllegal{
if(pos<0||pos>size){
throw new PosIllegal("Pos位置不合法!!!");
}
}
// 在 pos 位置新增元素
public void add(int pos, int data) {
try{
checkpos(pos);
if(isFull()){
grow();
}
for (int i =this.size; i >pos ; i--) {
array[i]=array[i-1];
}
array[pos]=data;
this.size++;
}catch(PosIllegal e){
System.out.println("插入元素的pos位置不合法!!!");
e.printStackTrace();
}
}
先判断输入的 参数pos 是否合法,若不合法,就丢出异常,正常的话,就按照第一个方法进行执行,不过要注意,从最后开始,用 for循环 将数组元素依次后移,直至到目标下标为止。将数据赋值给数组的下表即可,最后也要记得使 size++。
3、判定是否包含某个元素
public boolean contains(int toFind) {
for (int i = 0; i <this.size ; i++) {
if(toFind==array[i]){
return true;
}
}
return false;
}
这个方法不多解释,包含返回 true,不包含返回 false
4、查找某个元素对应的位置
// 查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i <this.size ; i++) {
if (toFind == array[i]) {
return i;
}
}
return -1;
}
5、获取 pos 位置的元素
这个方法就相对麻烦一点点了,你要获取数组中下标为 pos 的数据,同上,需要先判断传入的 pos 是否合法,仔细观察我们可以发现,此时检查 pos 的方法不再是 checkpos() 而是checkpos1(),因为获取 pos 的下标不能等于数组元素,在此位置无元素!
另外还要判断数组是否为空数组。
private void checkpos1(int pos) throws PosIllegal{
if(pos<0||pos>=size){
throw new PosIllegal("Pos位置不合法!!!");
}
}
// 获取 pos 位置的元素
public int get(int pos) {
try{
isEmpty();
checkpos1(pos);
}catch (PosIllegal e){
System.out.println("插入元素的pos位置不合法!!!");
e.printStackTrace();
}catch (EmptyException e){
System.out.println("数组为空数组,无法进行获取!!!");
e.printStackTrace();
}
return -1;
}
同样,空数组要给异常。
private void checkpos1(int pos) throws PosIllegal{
if(pos<0||pos>=size){
throw new PosIllegal("Pos位置不合法!!!");
}
}
private void isEmpty() throws EmptyException{
if(this.size==0){
throw new EmptyException("该数组为空!!!");
}
}
6、给 pos 位置的元素设为 value
public void set(int pos, int value) {
try{
isEmpty();
checkpos1(pos);
array[pos]=value;
}catch(EmptyException e){
System.out.println("数组为空数组,无法进行更新!!!");
e.printStackTrace();
}catch(PosIllegal e){
System.out.println("插入元素的pos位置不合法!!!");
e.printStackTrace();
}
}
7、删除第一次出现的关键字key
//删除第一次出现的关键字key
public void remove(int toRemove) {
try {
isEmpty();
int pos=indexOf(toRemove);
if(pos==-1){
return;
}
for (int i = pos; i < this.size-1; i++) {
array[i]=array[i+1];
}
this.size--;
}catch(EmptyException e){
System.out.println("数组为空数组,无法进行删除操作!!!");
e.printStackTrace();
}
}
8、其余必要方法
// 获取顺序表长度
public int size() {
return this.size;
}
// 清空顺序表
public void clear() {
this.size=0;
}
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public void display() {
for (int i = 0; i < this.size; i++) {
System.out.print(array[i]+" ");
}
}