IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【Java数据结构】手写泛型数组 -> 正文阅读

[数据结构与算法]【Java数据结构】手写泛型数组

如何构建一个我们自己使用的泛型数组
1.可以扩容
2.接收“任何”类型(基本数据类型使用包装类型 )
3.增删改查

存储泛型数据

private E[] data;
private int size;

构造函数

    public Array() {
        this(10);
    }

    public Array(int capacity) {
        data = (E[]) new Object[capacity];
        this.size = 0;
    }
//要注意了,这个是创建一个泛型数组,泛型数组不能通过下面的方式进行创建
new E[capacity];// 这是错误的 

扩容方法

扩容就是新建另一个数组,然后把当前数据拷贝到另一个数组中,然后data指向新数组

    private void resize(int capacity) {
        E[] newData = (E[]) new Object[capacity];
        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        data = newData;
        }
    }

插入数据方法

    /**
     * 向Array中index位置添加一个元素[即原来的index位]
     * @param index
     * @param e
     * @return
     */
    public void insert( int index , E e ) {
//      如果大小等于容量,就需要扩容
        if (size == data.length){
            resize(2 * data.length);
        }
        if (index < 0 || index > size){
            throw new IllegalArgumentException("添加失败,索引参数有误");
        }
        for (int i = size-1; i >= index; i--) {
            data[i+1] = data[i];
        }
        data[index] = e;
        size++;
    }

在for循环中,我们是从数组的后端,把每个元素都后移一位 。
为什么i是从size-1开始,会不会数组越界
size是数组的元素个数,在上一次添加时,就已经有了size个元素了(当前的元素没有添加进去,共有size个数,第size+1个数,即索引为size)
在这里插入图片描述
全部代码

public class Array<E> {
   private E[] data;
   private int size;

   /**
    * 构造方法 :如果传参,就按照传参大小创建容量,否则容量10
    */
   public Array() {
       this(10);
   }

   public Array(int capacity) {
       data = (E[]) new Object[capacity];
       this.size = 0;
   }

   /**
    * 向数组里面添加一个元素,添加到末尾
    * 由于我们已经写好了一个可以设置插入位置的插入元素方法
    * 所以现在可以通过
    */
   public void addLast(E e){

       insert(size,e);
   }

   private void resize(int capacity) {
       E[] newData = (E[]) new Object[capacity];
       for (int i = 0; i < size; i++) {
           newData[i] = data[i];
       data = newData;
       }
   }


   /**
    * 向Array中index位置添加一个元素[即原来的index位]
    * @param index
    * @param e
    * @return
    */
   public void insert( int index , E e ) {
//      如果大小等于容量,就需要扩容
       if (size == data.length){
           resize(2 * data.length);
       }
       if (index < 0 || index > size){
           throw new IllegalArgumentException("添加失败,索引参数有误");
       }
       for (int i = size-1; i >= index; i--) {
           data[i+1] = data[i];
       }
       data[index] = e;
       size++;
   }

   public E get(int index){
       if (index < 0 || index >= size){
           throw new IllegalArgumentException("获取数据失败,索引有误");
       }
       return data[index];
   }

   public void set(int index , E e ){
       if (index < 0 || index >= size){
           throw new IllegalArgumentException("获取数据失败,索引有误");
       }
       data[index] = e;
   }

   public boolean contains(E e){
       for (int i = 0; i < size; i++) {
           if (data[i] == e){
               return true;
           }
       }
       return false;
   }

   /**
    * 查找数组中元素e所在的索引,如果不存在e,就返回-1
    * @param e
    * @return
    */
   public int find(E e){
       for (int i = 0; i < size; i++) {
           if (data[i] == e){
               return i;
           }
       }
       return -1;
   }

   public E remove( int index ){
       if (index < 0 || index >= size){
           throw new IllegalArgumentException("获取数据失败,索引有误");
       }
       E deleteE = data[index];
       for (int i = index+1; i > size ; i--) {
           data[i-1] = data[i];
       }
       size--;
       return deleteE;
   }


   public E removeFirst(){
       return remove(0);
   }

   /**
    * 这里不需要使用
    * @param index
    * @return
    */
   public E removeLast(){
       return remove(size-1);
   }

   public void removeElement(E e){
       int index = find(e);
       if (index != -1){
           remove(index);
       }
   }

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



   public int getSize(){
       return size;
   }

   public int getCapacity(){
       return data.length;
   }

   @Override
   public String toString() {
       StringBuilder stringBuilder=new StringBuilder();
       for (int i = 0; i < size; i++) {
           stringBuilder.append(i+" ");
       }
       return "Array{" +
               "data = " + stringBuilder.toString() +
               ", size = " + size +
               '}' +
               "capacity = " + data.length;
   }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 18:07:49  更:2022-04-18 18:08:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:25:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码