1. 程式人生 > 其它 >Java -自定義陣列

Java -自定義陣列

技術標籤:java陣列

陣列存放相同資料型別資料且大小在初始化已被固定,因此使用靈活性被減小,對此在Java 出現了Arraylist 動態陣列,其容量大小靈活擴充套件。此文將實現類似的動態陣列,進行基本的增刪改查操作。為了適應各種資料型別的陣列操作,在此引入泛型。泛型簡單的意思就是泛指的型別(引數化型別)。想象下這樣的場景:如果我們現在要寫一個容器類(支援資料增刪查詢的),我們寫了支援String型別的,後面還需要寫支援Integer型別的。然後呢?Doubel、Float、各種自定義型別?這樣重複程式碼太多了,而且這些容器的演算法都是一致的。我們可以通過泛指一種型別E,來代替我們之前需要的所有型別,把我們需要的型別作為引數傳遞到容器裡面,這樣我們演算法只需要寫一套就可以適應所有的型別。最典型的的例子就是ArrayList了,這個集合我們無論傳遞什麼資料型別,它都能很好的工作。

首先進行泛型類及其類屬性和構造方法的定義

public class CreateArray<E>
{
    private Object[]obj=new Object[0]; //向上轉型Object類 Object類是所有類的父類適應於各種資料型別

    public Object[] getObj()
    {
        return obj;
    }
}

下面進行動態陣列新增的方法定義,新建一個新陣列將原陣列逐一對應複製到新陣列內,新陣列最後一個元素將被插入新元素,最後重新指向新陣列 類似於C語言的指標,程式碼如下:

public void add(E e)
//增加資料 { Object []objnew=new Object[obj.length+1]; objnew[objnew.length-1]=e; for(int i=0;i<objnew.length-1;i++) { objnew[i]=obj[i]; } obj=objnew; }

實現查詢功能就是遍歷比較元素是否相同,最後並將結果返回,程式碼如下:

  public int find(E e) //查詢資料
  {
        int index=
0; for(int i=0;i<obj.length;i++) { if(e.equals(obj[i])) { index=i; } } return index; }

接下來定義刪除功能,先用查詢方法找到刪除元素的位置,接下來遇到該位置就跳過,程式碼如下:

 public void remove(E e) //刪除資料
 {
        int index=find(e);
        Object [] objNew=new Object[obj.length-1];
        int i=0;
        int j=0;

        while(j<=objNew.length-1)
        {
            if(i==index)
            {
                i++;
            }
            objNew[j++]=obj[i++];
        }

        obj=objNew;

  }

修改的功能就比較簡單了,用查詢方法先把修改元素找到,然後對應替換成新的元素,程式碼如下:

 public void Update(E e1,E e2) //修改資料
 {
        int index=find(e1);
        for(int i=0;i<obj.length;i++)
        {
            if(index==i)
            {
                obj[i]=e2;
            }
        }

  }

接下來進行自由發揮,比如獲取指定索引的元素並返回該元素,程式碼如下:

 public Object get(int index) //獲取指定索引的元素
 {
        Object oop=null;
        for(int i=0;i<obj.length;i++)
        {
            if(index==i)
            {
                oop=obj[i];
                break;
            }
        }
        return oop;
  }

最後我們可以列印輸出一下動態陣列,如果要用 System.out.println() 方法直接輸出,需重寫toString()方法,否則打印出來的地址,程式碼如下:

  @Override
    public String toString() //重寫toString方法
    {
        return Arrays.toString(obj);
    }

    public void printArray() //列印動態陣列
    {
        for (int i=0;i<this.obj.length;i++)
        {
            System.out.println(obj[i]);
        }

    }

到此所有定義已完畢,通過測試各項功能正常,歡迎大家交流討論!