首頁  >  文章  >  Java  >  java怎麼自訂類別封裝數組實作資料操作

java怎麼自訂類別封裝數組實作資料操作

WBOY
WBOY轉載
2023-04-19 11:10:041181瀏覽

陣列做為一種基礎的資料儲存結構,應用十分廣泛。陣列是用連續的記憶體空間來儲存固定長度的、相同資料型別的一種資料結構。資料結構是跟語言無關的,這裡,使用java來進行數組的相關操作。數組的索引是從0開始的。

java怎麼自訂類別封裝數組實作資料操作

一數組初始化

創建資料有兩種方式,一種是先宣告一個固定長度的數據,然後再給數組賦值,另一種是直接賦值。

第一種

数据类型[] 数组名称 = new 数据类型[长度];

這裡的[]標識這宣告了一個數組,這個[]除了可以放在資料型別後面,也可以放在數組名詞後面,效果一樣。假如我申明一個長度為2long#類型的數組,並賦值:

long[] arr = new long[2];
arr[0] = 1;
arr[1] = 2;

第二種

数据类型[] 数组名称 = {元素1,元素2, ...};

這樣在陣列初始化的時候直接給陣列賦值,陣列的長度由元素的個數決定。

二自訂類別封裝陣列實作資料運算

public class MyArray {

    // 自定义数组    private long[] arr;
    // 有效数据长度    private int element;

    public MyArray(){
        arr = new long[9];
    }

    public MyArray(int maxsize){
        arr = new long[maxsize];
    }
    /**
     * 显示数组元素
     */    public void display(){
        System.out.print("[");
        for (int i = 0; i < element; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.print("]");
    }
}

2.1 新增元素

陣列是用連續的記憶體空間來儲存資料的,則每次新增的時候會往目前數組的最後一個元素上加入元素,一次就可以加上元素,所以它的複雜度為O(1),假如定義一個長度為9數組,數組中已經有兩個元素,則加入第三個元素如下:

java怎麼自訂類別封裝數組實作資料操作

public void add(long value){
    arr[element] = value;
    element++;
}

2.2 根據值查詢元素位置

#這種查找方式也叫做線性查找,就是根據傳入的值循環去遍歷元素,來取得對應的位置,理論上平均查詢一個元素需要花費N/2次,所以它的複雜度為O(N)。

public int find(long value){
    int i;
    for (i = 0; i < element; i++) {
        if(value == arr[i]){
            break;
        }
    }
    if(i == element){
        return -1;
    }else {
        return i;
    }
}

2.3 根據索引查詢元素

根據索引來找出元素,也就是取得對應位置的元素,其複雜度為O(1)。

public long get(int index){
    if(index >= element || index < 0){
        throw new ArrayIndexOutOfBoundsException();
    }else {
        return arr[index];
    }
}

2.4 根據索引刪除元素

刪除對應索引的元素後,我們需要將所有改索引後面的元素,向前移動一位。假如我要刪除索引為2的元素,如下:

java怎麼自訂類別封裝數組實作資料操作

理論上平均刪除一個元素,我們需要移動N/2次,所以它的時間複雜度也為O(N)。

public void delete(int index){
    if(index >= element || index < 0){
        throw new ArrayIndexOutOfBoundsException();
    }else {
        for (int i = index; i < element; i++) {
            arr[index] = arr[index+1];
        }
        element --;
    }
}

2.5 修改元素

修改某個位置的元素,直接根據索引就一次就可以修改對應的元素,所以它的時間複雜度為O(1)。

public void change(int index,long newValue){
    if(index >= element || index < 0){
        throw new ArrayIndexOutOfBoundsException();
    }else {
        arr[index] = newValue;
    }
}

三 有序數組

有序數組是數組的一種特殊類型,有序數組中的元素按照某種順序進行排列。

3.1 新增元素

在新增元素的時候,將元素依序新增到某個位置。如下,在一個陣列中加入一個33的元素。

java怎麼自訂類別封裝數組實作資料操作

首先,將索引為3的元素移動到索引為4的位置,然後將索引為2的元素移動到索引為3的位置,最後將33添加到索引為2的位置。理論上插入一個元素需要移動元素的個數為N/2個,所以它的時間複雜度為O(N)。

public void add(long value){
    int i;
    for (i = 0; i < element; i++) {
        if(arr[i]>value){
            break;
        }
    }

    for (int j = element; j > i; j--){
        arr[j] = arr[j-1];
    }
    arr[i] = value;
    element++;
}

3.2 二分法根據元素查詢索引

在無序數組中,使用線性法進行查找相關元素,線性法即按索引按個查找。有序數組可以使用二分法來找出元素,而二分法是指將一個陣列從中間分成兩個,判斷元素位於哪個陣列中,然後重複這樣的運算。

假如有8個元素的一個數組,數組內容為有序的0-7的序列,要找出5這個元素,第一次分成0-3和4-7兩個數組,然後再將4-7分成4-5和6-7兩個數組,最後再將4-5分成4和5就查詢出來具體的元素了,這樣分割3次就可以查詢出長度為8的數組中具體的元素,其複雜度即為O(logN)(logN在計算機中底數一般指的是2,意思為2的幾次方等於n)。

public int search(long value){
    // 中间值    int middle = 0;
    // 最小值    int low = 0;
    // 最大值    int pow = element;
    while (true){
        middle = (low + pow) / 2;
        if(arr[middle] == value){
            return middle;
        }else if (low > pow){
            return -1;
        }else{
            if(arr[middle] > value){
                pow = middle - 1;
            }else{
                low = middle + 1;
            }
        }
    }
}

四總結

複雜度越低代表演算法比較優秀,所以O(1) > O(logN) > O(N) > O(N^2) 。

O(N)O(logN)O(1)O(N)O(N)
演算法 複雜度
線性找出
二分法找出
無序陣列插入
有順序陣列插入
無序陣列刪除
  1. 有序數組刪除

    O(N)
####無序數組插入快,查找和刪除慢############有序數組查找快,插入和刪除慢#########

以上是java怎麼自訂類別封裝數組實作資料操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除