欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):線性表

 更新時(shí)間:2021年07月27日 15:25:25   作者:魚(yú)小洲  
這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助

前言

其實(shí)線性表在生活中和棧的結(jié)構(gòu)差不多。昨天總結(jié)了一篇單鏈表,也是線性表的一種。

今天用另一種寫(xiě)法來(lái)控制指針的移動(dòng)實(shí)現(xiàn)數(shù)據(jù)的順序存儲(chǔ)結(jié)構(gòu)。

需求分析

首先要明確,這種順序存儲(chǔ)結(jié)構(gòu)的線性表底層用什么。根據(jù)之前查看過(guò)的源碼來(lái)看,list一般都是以數(shù)組為底層。我們也不例外。

其次,我們還得去定義好線性表的長(zhǎng)度,以及每個(gè)元素的指針。

private Object[] arr; // 底層的結(jié)構(gòu)
private int index = -1; // 代表元素的索引位置
private int size; // 當(dāng)前線性表的長(zhǎng)度
private int LinearListLength = 4; // 線性表的默認(rèn)長(zhǎng)度

我們這兒只演示添加、刪除、獲取指定位置、獲取全部以及判斷是否為空這五種形式。

編碼

add方法

add方法為向線性表中添加元素,需要傳入一個(gè)泛型參數(shù)。實(shí)現(xiàn)思路是讓index+1然后把index賦值給數(shù)組得到索引區(qū)域,再讓size+1

總體設(shè)計(jì)比較簡(jiǎn)單,看代碼。

public E add(E item) {
        // 先初始化線性表
        capacity();
        // 初始化完成后先把index指針后移一位,也就是+1
        // 后移一位之后將要添加的元素賦值到數(shù)組中
        this.arr[++index] = item;
        System.out.println(index);
        // 添加完成后長(zhǎng)度+1
        this.size++;
        return item;
    }

getIndex方法

getIndex方法主要是用來(lái)獲取指定位置的元素,這個(gè)就很簡(jiǎn)單了,因?yàn)榈讓邮菙?shù)組,所以我們可以直接用數(shù)組的索引去獲取。

public E getIndex(int index) {
        return (E) this.arr[index];
    }

pop方法

pop方法作用是刪除指定位置的元素。需要傳入一個(gè)int類型的索引。由于特殊性,我們必須得借用上面的獲取指定位置的元素的方法來(lái)實(shí)現(xiàn)這一步驟。

在元素刪除后,通過(guò)遍歷循環(huán)去將index位置向前移動(dòng)一位。具體代碼如下:

/**
 * 刪除指定位置的元素
 */
public E pop(int index) {
    E e = getIndex(index);
    if (e != null) {
        for (int i = index; i < size; i++) {
            arr[i] = arr[i + 1];
        }
        this.size--;
        return e;
    } else {
        return null;
    }
}

insert方法

insert方法需要傳入兩個(gè)參數(shù),一個(gè)int類型的索引值,一個(gè)泛型數(shù)據(jù)。在指定位置插入該泛型值,然后將后面的值全部后移一位。

public E insert(int index, E item) {
        System.out.println(size);
        for (int i = index; i < size; i++) {
            arr[i + 1] = arr[i];
        }
        arr[index] = item;
        this.size++;
        return item;
    }

getAll

這個(gè)方法不用我多說(shuō)了,一個(gè)簡(jiǎn)單的遍歷循環(huán)

public void getAll() {
        for (Object o : this.arr) {
            System.out.println(o);
        }
    }

這兒遍歷的Object類型會(huì)自動(dòng)轉(zhuǎn)化成添加元素時(shí)的類型

全部代碼

package com.zxy.xianxingbiao;
/**
 * @Author Zxy
 * @Date 2021/2/4 16:54
 * @Version 1.0
 */
import java.util.Arrays;
/**
 * 演示線性表的使用  底層使用數(shù)組
 */
public class MyLinearList<E> {
    private Object[] arr; // 底層的結(jié)構(gòu)
    private int index = -1; // 代表元素的索引位置
    private int size; // 當(dāng)前線性表的長(zhǎng)度
    private int LinearListLength = 4; // 線性表的默認(rèn)長(zhǎng)度
    /**
     * 判斷線性表是否為空
     */
    public boolean empty() {
        return this.size == 0 ? true : false;
    }
    /**
     * 給線性表中添加元素
     */
    public E add(E item) {
        // 先初始化線性表
        capacity();
        // 初始化完成后先把index指針后移一位,也就是+1
        // 后移一位之后將要添加的元素賦值到數(shù)組中
        this.arr[++index] = item;
        System.out.println(index);
        // 添加完成后長(zhǎng)度+1
        this.size++;
        return item;
    }
    /**
     * 在指定位置插入元素
     */
    public E insert(int index, E item) {
        System.out.println(size);
        for (int i = index; i < size; i++) {
            arr[i + 1] = arr[i];
        }
        arr[index] = item;
        this.size++;
        return item;
    }
    /**
     * 獲取指定位置的元素
     */
    public E getIndex(int index) {
        return (E) this.arr[index];
    }
    /**
     * 刪除指定位置的元素
     */
    public E pop(int index) {
        E e = getIndex(index);
        if (e != null) {
            for (int i = index; i < size; i++) {
                arr[i] = arr[i + 1];
            }
            this.size--;
            return e;
        } else {
            return null;
        }
    }
    /**
     * 獲取全部的元素
     */
    public void getAll() {
        for (Object o : this.arr) {
            System.out.println(o);
        }
    }
    /**
     * 數(shù)組初始化或者以1.5倍容量對(duì)數(shù)組擴(kuò)容
     */
    private void capacity() {
        // 數(shù)組初始化
        if (this.arr == null) {
            this.arr = new Object[this.LinearListLength];
        }
        // 以1.5倍對(duì)數(shù)組擴(kuò)容
        if (this.size - (this.LinearListLength - 1) >= 0) { // 如果當(dāng)前數(shù)組的元素個(gè)數(shù)大于了當(dāng)前數(shù)組的最后一個(gè)索引值
            this.LinearListLength = this.LinearListLength + (this.LinearListLength >> 1); // 位運(yùn)算,讓長(zhǎng)度變成原來(lái)的1/2
            this.arr = Arrays.copyOf(this.arr, this.LinearListLength); // 復(fù)制一個(gè)新的數(shù)組,用新開(kāi)辟的長(zhǎng)度
        }
    }
    public static void main(String[] args) {
        MyLinearList<String> list = new MyLinearList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list.getIndex(1));
        list.pop(1);
        System.out.println(list.getIndex(1));
        list.getAll();
    }
}

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java窗體中關(guān)于默認(rèn)布局管理器容易踩的坑及解決

    Java窗體中關(guān)于默認(rèn)布局管理器容易踩的坑及解決

    這篇文章主要介紹了Java窗體中關(guān)于默認(rèn)布局管理器容易踩的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java 實(shí)戰(zhàn)項(xiàng)目之在線點(diǎn)餐系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)項(xiàng)目之在線點(diǎn)餐系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Java啟動(dòng)參數(shù)(-,?-X,?-XX參數(shù))的使用

    Java啟動(dòng)參數(shù)(-,?-X,?-XX參數(shù))的使用

    本文主要介紹了Java啟動(dòng)參數(shù)(-,?-X,?-XX參數(shù))的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java中ArrayList的使用詳細(xì)介紹

    Java中ArrayList的使用詳細(xì)介紹

    這篇文章主要介紹了Java中ArrayList的使用,本文給大家詳細(xì)講述該相關(guān)的知識(shí)點(diǎn),并且會(huì)通過(guò)大量的案例加以說(shuō)明,需要的朋友可以參考一下
    2022-04-04
  • 關(guān)于Java中的CAS如何使用

    關(guān)于Java中的CAS如何使用

    這篇文章主要介紹了關(guān)于Java中的CAS如何使用,CAS是Compare And Swap(比較并交換)的縮寫(xiě),是一種非阻塞式并發(fā)控制技術(shù),用于保證多個(gè)線程在修改同一個(gè)共享資源時(shí)不會(huì)出現(xiàn)競(jìng)爭(zhēng)條件,從而避免了傳統(tǒng)鎖機(jī)制的各種問(wèn)題,需要的朋友可以參考下
    2023-09-09
  • java面向?qū)ο笤O(shè)計(jì)原則之開(kāi)閉原則示例解析

    java面向?qū)ο笤O(shè)計(jì)原則之開(kāi)閉原則示例解析

    這篇文章主要介紹了java面向?qū)ο笤O(shè)計(jì)原則之開(kāi)閉原則的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-10-10
  • java簡(jiǎn)易文本分割器實(shí)現(xiàn)代碼

    java簡(jiǎn)易文本分割器實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)易文本分割器的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • mybatis?報(bào)錯(cuò)顯示sql中有兩個(gè)limit的解決

    mybatis?報(bào)錯(cuò)顯示sql中有兩個(gè)limit的解決

    這篇文章主要介紹了mybatis?報(bào)錯(cuò)顯示sql中有兩個(gè)limit的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 使用IntelliJ IDEA 進(jìn)行代碼對(duì)比的方法(兩種方法)

    使用IntelliJ IDEA 進(jìn)行代碼對(duì)比的方法(兩種方法)

    這篇文章給大家?guī)?lái)了兩種IntelliJ IDEA 進(jìn)行代碼對(duì)比的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • SpringCloud?LoadBalancerClient?負(fù)載均衡原理解析

    SpringCloud?LoadBalancerClient?負(fù)載均衡原理解析

    LoadBalancerClient?是?SpringCloud?提供的一種負(fù)載均衡客戶端,Ribbon?負(fù)載均衡組件內(nèi)部也是集成了?LoadBalancerClient?來(lái)實(shí)現(xiàn)負(fù)載均衡,本文給大家深入解析?LoadBalancerClient?接口源碼,感興趣的朋友跟隨小編一起看看吧
    2022-02-02

最新評(píng)論