自定义实现简易版ArrayList

简介: 自定义实现简易版ArrayList

1.了解什么是顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

2.实现哪些功能

对于一个顺序表来说

我们做的最多的也就是增删查改

则实现以下接口:

public interface IList {
    //新增元素,默认在数组最后新增
    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();
  //判断是否已满
    boolean isFull();
  //判断是否为空
    public boolean isEmpty();
}

3.初始化ArrayList

usedSize为使用的长度

DEFAULT_SIZE = 10为默认顺序表的容量

两个构造方法

无参构造:顺序表默认大小为10;

有参构造:自定义顺序表大小;

public class MyList implements IList{
    public int[] elem ;
    public int usedSize;//0
    //顺序表的 默认大小
    public static final int DEFAULT_SIZE = 10;
    public MyList(){
        this.elem = new int[DEFAULT_SIZE];
    }
    public MyList(int capacity){
        this.elem = new int[capacity];
    }
 }

4.实现功能接口

遍历顺序表

public void display(){
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }

判断顺序表是否已满

public boolean isFull(){
        return usedSize == elem.length;
     }

添加元素

checkCapacity()判断顺序表是否已满,如果已经满了则进行扩容

扩容为原来顺序表的两倍

 private void checkCapacity(){
        if(isFull()){
            elem = Arrays.copyOf(elem,elem.length*2);
        }
    }
    public void add(int data){
        checkCapacity();
        elem[this.usedSize] = data;
        this.usedSize++;
    }

指定下标添加元素

checkPosOnAdd()判断下标是否合法,如果不合法抛出异常

public void checkPosOnAdd(int pos) throws PosIllegality{
        if(pos < 0 || pos >usedSize){
            System.out.println("不合法!");
            throw new PosIllegality("获取指定下标的元素异常: "+pos);
        }
    }
    public void add(int pos, int data){
        try{
            checkPosOnAdd(pos);
        }
        catch (PosIllegality e){
            e.printStackTrace();
            return;
        }
        checkCapacity();
        for (int i = usedSize-1; i >= pos; i--) {
            elem[i+1] = elem[i];
        }
        elem[pos] = data;
        usedSize++;
    }

自定义下标不合法异常

package mylist;
public class PosIllegality extends RuntimeException{
    public PosIllegality(String msg){
        super(msg);
    }
}

判断顺序表是否为空

public boolean isEmpty(){
        return usedSize == 0;
    }

查找指定元素是否存在

  public boolean contains(int toFind){
        if(isEmpty()){
            return false;
        }
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }

查找指定元素返回下标

 public int indexOf(int toFind){
        if(isEmpty()){
            return -1;
        }
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }

获取指定下标的元素

public void checkPosOnGetAndSet(int pos) throws PosIllegality {
        if(pos < 0 || pos >= usedSize){
            System.out.println("不合法");
            throw new PosIllegality("获取指定下标的元素异常: "+pos);
        }
    }
    public int get(int pos) throws MyArrayListEmpty{
        checkPosOnGetAndSet(pos);
        if(isEmpty()){
                throw new MyArrayListEmpty("获取指定下标元素时" +
                        "顺序表为空!");
        }
            return elem[pos];
    }

顺序表为空异常

package mylist;
public class MyArrayListEmpty extends RuntimeException{
    public MyArrayListEmpty(String msg){
        super(msg);
    }
}

修改指定下标元素的值

public void set(int pos, int value){
        checkPosOnGetAndSet(pos);
        elem[pos] = value;
    }

删除指定元素

  public void remove(int toRemove){
        int index = indexOf(toRemove);
        if(index == -1){
            System.out.println("没有找到");
            return;
        }
        for (int i = index; i < usedSize - 1; i++) {
            elem[i] =elem[i+1];
        }
        usedSize--;
    }

顺序表长度

  public int size(){
        return this.usedSize;
    }

回收顺序表

public void clear() {
        usedSize = 0;
    }

完整代码

package mylist;
import java.util.Arrays;
public class MyList implements IList{
    public int[] elem ;
    public int usedSize;//0
    //顺序表的 默认大小
    public static final int DEFAULT_SIZE = 10;
    public MyList(){
        this.elem = new int[DEFAULT_SIZE];
    }
    public MyList(int capacity){
        this.elem = new int[capacity];
    }
    public void display(){
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }
     public boolean isFull(){
        return usedSize == elem.length;
     }
    private void checkCapacity(){
        if(isFull()){
            elem = Arrays.copyOf(elem,elem.length*2);
        }
    }
    public void add(int data){
        checkCapacity();
        elem[this.usedSize] = data;
        this.usedSize++;
    }
    public void checkPosOnAdd(int pos) throws PosIllegality{
        if(pos < 0 || pos >usedSize){
            System.out.println("不合法!");
            throw new PosIllegality("获取指定下标的元素异常: "+pos);
        }
    }
    public void add(int pos, int data){
        try{
            checkPosOnAdd(pos);
        }
        catch (PosIllegality e){
            e.printStackTrace();
            return;
        }
        checkCapacity();
        for (int i = usedSize-1; i >= pos; i--) {
            elem[i+1] = elem[i];
        }
        elem[pos] = data;
        usedSize++;
    }
    public boolean isEmpty(){
        return usedSize == 0;
    }
    public boolean contains(int toFind){
        if(isEmpty()){
            return false;
        }
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
    public int indexOf(int toFind){
        if(isEmpty()){
            return -1;
        }
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }
    public void checkPosOnGetAndSet(int pos) throws PosIllegality {
        if(pos < 0 || pos >= usedSize){
            System.out.println("不合法");
            throw new PosIllegality("获取指定下标的元素异常: "+pos);
        }
    }
    public int get(int pos) throws MyArrayListEmpty{
        checkPosOnGetAndSet(pos);
        if(isEmpty()){
                throw new MyArrayListEmpty("获取指定下标元素时" +
                        "顺序表为空!");
        }
            return elem[pos];
    }
    public void set(int pos, int value){
        checkPosOnGetAndSet(pos);
        elem[pos] = value;
    }
    public void remove(int toRemove){
        int index = indexOf(toRemove);
        if(index == -1){
            System.out.println("没有找到");
            return;
        }
        for (int i = index; i < usedSize - 1; i++) {
            elem[i] =elem[i+1];
        }
        usedSize--;
    }
    public int size(){
        return this.usedSize;
    }
    public void clear() {
        usedSize = 0;
    }
}
目录
相关文章
|
17天前
|
存储 算法 Java
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
30 0
|
5月前
|
存储 Java 索引
【零基础学Java】—ArrayList集合概述和基本使用(十四)
【零基础学Java】—ArrayList集合概述和基本使用(十四)
|
2月前
|
存储 C++
C++STL模板之——list(简化源码,模拟源码)
C++STL模板之——list(简化源码,模拟源码)
|
5月前
|
存储 C++ 容器
【C++】STL容器——list类的使用指南(含代码演示)(13)
【C++】STL容器——list类的使用指南(含代码演示)(13)
|
5月前
|
安全 Java
Java中如何快捷的创建不可变集合
Java中如何快捷的创建不可变集合
23 0
|
5月前
|
Java 容器
史上最全的Java容器集合之ArrayList(源码解读)(二)
史上最全的Java容器集合之ArrayList(源码解读)(二)
33 1
|
7月前
|
XML 存储 JSON
java框架集合List子接口之ArrayList源码剖析
ArrayList使用尾删法时 , 时间复杂度为O(1) , 并且会把最后一个元素置位null , 其它删除时间复杂度为O(N) , 因为会涉及到元素的移动以及元素的遍历 ArrsyList是线程不安全的
26 0
|
9月前
|
Java
Java List操作好帮手:ListUtil工具类实用技巧
Java List操作好帮手:ListUtil工具类实用技巧
90 0
|
Java
Java 将list集合按照指定大小进行分割 方便使用多线程处理【项目】
Java 将list集合按照指定大小进行分割 方便使用多线程处理【项目】
228 0
|
存储 Java
Java中Map集合概述特点、基本功能、获取功能及Map集合的两种遍历方式
Map集合概述特点、基本功能、获取功能及Map集合的两种遍历方式的简单示例
113 0
Java中Map集合概述特点、基本功能、获取功能及Map集合的两种遍历方式