Java資料結構-陣列

牛覓發表於2018-01-23

陣列是應用最廣泛的資料儲存結構。它被植入到大部分程式語言中。由於陣列十分易懂,所以它被用來作為介紹資料結構的起步點,並展示物件導向程式設計和資料結構之間的相互關係。

使用陣列

建立陣列

Java中兩種資料型別:基本型別和物件型別。在許多程式語言中(如C++),陣列也是基本型別,但在Java中把它們當作物件來對待,因此在建立陣列時必須使用new操作符:

 int[] intArray;
 intArray = new int[100];
複製程式碼

[] 操作符對編譯器來說是一個標誌,它說明正在命名的是陣列物件而不是普通的變數。還可以通過另一種語法來使用這個操作符,將它放在變數名的後面,而不是型別後面:

int intArray[] = new int[100];
複製程式碼

但是將[] 放在int後面會清楚地說明[]是資料型別的一部分,而不是變數名的一部分。

獲取陣列大小

陣列有一個length欄位,通過它可以得知當前陣列大小(資料項的個數):

int arrayLength = intArray.length;
複製程式碼

正如大多數程式語言一樣,一旦建立陣列,陣列大小便不可改變

訪問陣列資料項

陣列資料項通過使用方括號中的下標數來訪問。這與其他語言類似:

temp = intArray[3];
intArray[7] = 66;
複製程式碼

如果訪問小於0或比陣列大小大的資料項,程式會出現Array Index Out of Bounds(陣列下標越界)的執行時差錯誤。陣列的下標是從0開始的,也就是說第一個資料項的下標是0。

初始化

當建立陣列之後,如果不另行指定,基本型別陣列會自動賦值為0或0.0而物件陣列會自動賦值為null物件。使用下面的語法可以對一個基本型別的陣列初始化,賦入非空值:

int[] intArray = {0,3,6,9,12,15};
複製程式碼

陣列使用的例子

/**
 * HighArray對陣列基本操作進行封裝
 */
public class HighArray {

    private long [] a;

    private int nElems;

    public HighArray(int max){
        a = new long[max];
        nElems = 0;
    }

    /**
     * 查詢
     */
    public boolean find(long searchKey){
        int j;
        for(j = 0; j < nElems;j++){
            if(a[j] == searchKey){
                break;
            }
        }
        if(j == nElems){
            return false;
        }
        else{
            return true;
        }
    }

    /**
     * 插入
     * @param value
     */
    public void insert(long value){
        a[nElems] = value;
        nElems++;
    }

    /**
     * 刪除
     * @param value
     * @return
     */
    public boolean delete(long value){
       int j;
       for(j = 0; j < nElems;j++){
           if(value == a[j]){
               break;
           }
       }
       if(j == nElems){
           return false;
       }else{
           // 移動後面的元素
           for (int k = j; k < nElems;k++){
               a[k] = a[k+1];
           }
           nElems--;
           return true;
       }
    }

    /**
     * 遍歷陣列元素
     */
    public void display(){
        for(int j = 0; j < nElems; j++){
            System.out.print(a[j]+" ");
        }
        System.out.println();
    }
}
複製程式碼

有序陣列

假設一個陣列,其中的資料項按關鍵字升序排列,即最小值在下標為0的單元上,每一個單元比前一個單元的值大。這種陣列被稱為有序陣列。將資料按順序排序的好處就是可以通過二分查詢顯著地提高查詢速度

當向這種陣列中插入資料項時,需要為插入操作找到正確的位置:剛好在稍小值的後面,稍大值的前面。然後將所有比待插入的資料項大的值向後移以便騰出空間。

二分查詢

二分查詢使用的方法與我們在孩童時期常玩的猜數遊戲中所用的方法一樣。在這個遊戲裡,一個朋友會讓你猜她正想的一個1至100之間的數。當你猜來一個數後,它會告訴你三種選擇中的一個:你猜的比她想的大,或小,或猜中了。

為了能用最少的次數猜中,必須從50開始猜。如果她說你猜得太小,則推出那個數在51至100之間,所以下一次猜75。但如果她說有些大,則推出那個數在1至49之間,所以下一次猜25。

每猜一次就會將可能的值劃分成兩部分。最後範圍會縮小到一個數字那麼大,那就是答案。

有序陣列的Java程式碼

public class OrdArray {

    private long[] a;
    private int nElems;

    public OrdArray(int max){
        a = new long[max];
        nElems = 0;
    }

    public int size(){
        return nElems;
    }

    // 二分查詢
    public int find(long searchKey){
        int lowerBound = 0;
        int upperBound = nElems - 1;
        int curIn;
        
        while (true){
            curIn = (lowerBound + upperBound) / 2;
            if(a[curIn] == searchKey){
                return curIn;
            }else if (lowerBound > upperBound){
                return nElems;   // can't find it
            }else {
                if(a[curIn] < searchKey){
                    lowerBound = curIn + 1;
                }else {
                    upperBound = curIn - 1;
                }
            }

        }
    }

    public void insert(long value){
        int j;
         // 找到待插入的位置
        for(j = 0; j < nElems;j++){
            if(a[j] > value){
                break;
            }
        }
        // 騰出空間
        for(int k = nElems;k > j;k--){ 
            a[k] = a[k-1];
        }
        a[j] = value;
        nElems++;
    }

    public boolean delete(long value){
        int j = find(value);
        if(j == nElems){
            return false;
        }else{
            for (int k = j;k < nElems;k++){
                a[k] = a[k+1];
            }
            nElems--;
            return true;
        }
    }

    public void display(){
        for(int j = 0; j < nElems; j++){
            System.out.print(a[j]+" ");
        }
        System.out.println();
    }
}
複製程式碼

歡迎留言補充,共同交流。個人微信公眾號求關注

Java資料結構-陣列

相關文章