Java数据结构手写泛型数组

Posted 写Bug的渣渣高

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
   


以上是关于Java数据结构手写泛型数组的主要内容,如果未能解决你的问题,请参考以下文章

(不要小瞧数组)玩转数据结构之数组,手写动态数组(Java)

恋上数据结构手写ArrayList + Java动态扩容分析

Java泛型:包含泛型的数组[重复]

Java泛型详解

C#中ArrayList和泛型集合List方法概述概述

java编程基础----泛型