(二)Java數據結構和算法——數組

1、數組的實現

  • 上一篇博客咱們介紹了一個數據結構必須具備如下基本功能:

  ①、如何插入一條新的數據項java

  ②、如何尋找某一特定的數據項算法

  ③、如何刪除某一特定的數據項數組

  ④、如何迭代的訪問各個數據項,以便進行顯示或其餘操做數據結構

 

package arrays;

import java.util.Arrays;

public class MyArray {

    private int[] intArray;

    private int elems;

    private int length;

    /**
     * 默認建立一個長度爲50的素組
     */
    public MyArray(){
        elems = 0;
        length = 50 ;
        intArray = new int[length];

    }

    /**
     * 自定義數組長度
     * @param length
     */
    public MyArray(int length){
        elems = 0;
        this.length = length;
        intArray = new int[length];
    }

    public int getSize(){
        return elems;
    }

    /**
     * 遍歷數組
     */
    public void display(){
        for(int i=0;i<elems;i++){
            System.out.println(intArray[i]);
        }
    }


    /**
     * 添加元素,
     * 添加成功返回true,添加的元素超過範圍了返回false
     * @param value
     * @return
     */
    public boolean add(int value){

        if(elems == length){
            return false;
        }
        intArray[elems] = value;
        elems++;
        return  true;

    }

    /**
     * 根據下標獲取元素
     *
     * @param index
     * @return
     */
    public int get(int index)  {
        if(index<0 || index>elems){
            System.out.println("數組元素越界");

        }

        return intArray[index];
    }

    /**
     * 查找元素
     *
     * @return 若是找到則返回元素下標,若是不存在則返回-1
     */
    public int search(int value){

        for(int i=0;i<elems;i++){
            if(intArray[i] == value){
                return i;
            }
        }
        return -1;
    }

    /**
     * 刪除元素
     * @param value
     * @return 刪除成功返回true,刪除的值不存在返回false
     */
    public boolean delete(int value){

      int index =   search(value);

      if(index != -1){

        if(index == elems-1){
            //恰好是最後一個元素
            elems--;
        }else{
            //將目標元素索引以後的元素所有往前移一位
            for(int i=index;i<elems;i++){
                intArray[i] = intArray[i+1];
            }
            elems--;
        }

        return true;
      }else{
          System.out.println("該值不存在");
          return false;
      }

    }


    /**
     * 修改值
     * @param oldValue
     * @param newValue
     * @return 修改爲功返回true,失敗返回false
     */
    public boolean modify(int oldValue ,int newValue){

       int index =  search(oldValue);
       if(index == -1){
           System.out.println("修改失敗:該值不存在");
           return false;
       }else{
            intArray[index] =  newValue;
            return true;
       }

    }

}

測試:測試

  public static void main(String[] args) {
        MyArray myArray = new MyArray(7);
        myArray.add(1);
        myArray.add(10);
        myArray.add(15);
        myArray.add(20);
        myArray.add(25);
        myArray.display();

        System.out.println("第0個元素爲="+myArray.get(0));
        myArray.delete(1);
        System.out.println("刪除後的數組爲");
        myArray.display();

        myArray.modify(15,1555);
        System.out.println("修改後的數組爲");
        myArray.display();
    }

結果:this

 

2、數組的優缺點

數組的侷限性分析:spa

  ①、插入快,對於無序數組,上面咱們實現的數組就是無序的,即元素沒有按照從大到小或者某個特定的順序排列,只是按照插入的順序排列。無序數組增長一個元素很簡單,只須要在數組末尾添加元素便可,可是有序數組卻不必定了,它須要在指定的位置插入。code

  ②、查找慢,固然若是根據下標來查找是很快的。可是一般咱們都是根據元素值來查找,給定一個元素值,對於無序數組,咱們須要從數組第一個元素開始遍歷,直到找到那個元素。有序數組經過特定的算法查找的速度會比無需數組快,後面咱們會講各類排序算法。blog

  ③、刪除慢,根據元素值刪除,咱們要先找到該元素所處的位置,而後將元素後面的值總體向前面移動一個位置。也須要比較多的時間。排序

  ④、數組一旦建立後,大小就固定了,不能動態擴展數組的元素個數。若是初始化你給一個很大的數組大小,那會白白浪費內存空間,若是給小了,後面數據個數增長了又添加不進去了。

  很顯然,數組雖然插入快,可是查找和刪除都比較慢,並且擴展性差,因此咱們通常不會用數組來存儲數據,那有沒有什麼數據結構插入、查找、刪除都很快,並且還能動態擴展存儲個數大小呢,答案是有的,可是這是創建在很複雜的算法基礎上,後面咱們也會詳細講解。

相關文章
相關標籤/搜索