溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Java實(shí)現(xiàn)順序表的操作

發(fā)布時(shí)間:2022-01-21 11:49:54 來源:億速云 閱讀:127 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下如何使用Java實(shí)現(xiàn)順序表的操作,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

具體內(nèi)容如下

靜態(tài)順序表:使用定長數(shù)組存儲(chǔ)。
動(dòng)態(tài)順序表:使用動(dòng)態(tài)開辟的數(shù)組存儲(chǔ)。

接口

package com.github.sqlist;

public interface ISequence {
    // 在 pos 位置插入 val
    boolean add(int pos, Object data);

    // 查找關(guān)鍵字 key 找到返回 key 的下表,沒有返回 -1
    int search(Object key);

    // 查找是否包含關(guān)鍵字 key 是否在順序表當(dāng)中(這個(gè)和search有點(diǎn)沖突)
    boolean contains(Object key);

    // 得到 pos 位置的值
    Object getPos(int pos);

    // 刪除第一次出現(xiàn)的關(guān)鍵字 key
    Object remove(Object key);

    // 得到順序表的長度
    int size();

    // 打印順序表
    void display();

    // 清空順序表以防內(nèi)存泄漏
    void clear();
}

實(shí)現(xiàn)接口里的每個(gè)方法

package com.github.sqlist;

import java.util.Arrays;

/*
 * 順序表
 */
public class MySequenceImpl implements ISequence {

    private Object[] elem;
    // 有效數(shù)據(jù)個(gè)數(shù)
    private int usedSize;
    private static final int DEFAULT_SIZE = 10;

    public SqList() {
        this.elem = new Object[DEFAULT_SIZE];
        this.usedSize = 0;
    }

    /**
     * 判斷是否為滿
     * @return 滿了返回true,否則返回false
     */
    private boolean isFull() {
        return this.elem.length == this.usedSize;
    }

    /**
     * 在 pos 位置插入 val
     * @param pos
     *        要插入的位置
     * @param data
     *        要插入的值
     * @return
     *        插入成功返回true,否則返回false
     */
    @Override
    public boolean add(int pos, Object data) {
        // 1. 判斷pos位置的合法性
        if (pos < 0 || pos > this.elem.length) {
            return false;
        }

        // 2. 判斷是否滿了,如果滿了進(jìn)行擴(kuò)容
        if (isFull()) {
            this.elem = Arrays.copyOf(this.elem, 2*this.elem.length);
        }

        // 3. 把pos位置以及之后的數(shù)全部向后挪一個(gè)位置
        for (int i = this.usedSize-1; i >= pos; i--) {
            this.elem[i+1] = this.elem[i];
        }

        // 4. 在 pos 位置插入 val
        this.elem[pos] = data;

        // 5. 更新長度
        this.usedSize++;

        return true;
    }

    /**
     * 判斷是否為空
     * @return 表為空返回true,否則返回false
     */
    private boolean isEmpty() {
        return this.usedSize == 0;
    }

    /**
     * 查找關(guān)鍵字 key 找到返回 key 的下表,沒有返回 -1
     * @param key 關(guān)鍵字的值
     * @return 查找成功返回true,失敗返回false
     */
    @Override
    public int search(Object key) {
        // 1. 判斷是否為空
        if (isEmpty()) {
            return -1;
        }

        // 2. 遍歷查找
        for (int i = 0; i < this.elem.length; i++) {
            // 注意:判斷條件不能寫成:this.elem[i] == key
            if (this.elem[i].equals(key)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 查找是否包含關(guān)鍵字 key 是否在順序表當(dāng)中(這個(gè)和search有點(diǎn)沖突)
     * @param key 關(guān)鍵字的值
     * @return 查找成功返回true,失敗返回false
     */
    @Override
    public boolean contains(Object key) {
        // 1. 判斷是否為空
        if (isEmpty()) {
            return false;
        }

        // 2. 遍歷查找
        for (int i = 0; i < this.elem.length; i++) {
            // 注意:判斷條件不能寫成:this.elem[i] == key
            if (this.elem[i].equals(key)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 得到 pos 位置的值
     * @param pos 得到的值的位置
     * @return 成功得到 pos位置的值返回true,否則返回false
     */
    @Override
    public Object getPos(int pos) {
        // 1. 判斷位置是否合法
        if (pos<0 || pos>=this.elem.length) {
            return null;
        }

        // 2. 位置合法
        return this.elem[pos];
    }

    /**
     * 刪除第一次出現(xiàn)的關(guān)鍵字 key
     * @param key 關(guān)鍵字
     * @return
     */
    @Override
    public Object remove(Object key) {
        // 1. 先查表看有沒有這個(gè)關(guān)鍵字
        // index:關(guān)鍵字下標(biāo)
        int index = search(key);

        // 2. 若表里沒有這個(gè)關(guān)鍵字
        if (index == -1) {
            return null;
        }

        // 3. 表里有這個(gè)關(guān)鍵字
        Object data = this.elem[index];
        int i;
        // 刪除第一次出現(xiàn)的關(guān)鍵字 key,把key后面的數(shù)全部向前挪一個(gè)位置
        for (i = index; i < this.usedSize; i++) {
            elem[i] = elem[i+1];
        }
        this.usedSize--;
        this.elem[i+1] = null;
        return data;
    }

    /**
     * 得到順序表的長度
     * @return 順序表的長度
     */
    @Override
    public int size() {
        return this.usedSize;
    }

    /**
     * 打印順序表
     */
    @Override
    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }

    /**
     * 清空順序表以防內(nèi)存泄漏
     */
    @Override
    public void clear() {
        for (int i = 0; i < this.usedSize; i++) {
            this.elem[i] = null;
        }
    }
}

測試方法的正確性

package com.github.sqlist;


public class TestDemo1 {
    public static void main(String[] args) {
        MySequenceImpl mySequence = new MySequenceImpl();

        for (int i = 0; i < 10; i++) {
            mySequence.add(i,i);
        }
        System.out.println("在最大值10的范圍內(nèi)插入數(shù)據(jù):");
        mySequence.display();
        System.out.println();

        for (int i = 10; i < 20; i++) {
            mySequence.add(i,i);
        }
        System.out.println("擴(kuò)容:");
        mySequence.display();
        System.out.println();

        System.out.println("隨機(jī)位置插入數(shù)據(jù):");
        mySequence.add(9,"list");
        mySequence.display();
        System.out.println();

        System.out.println("search查找一個(gè)數(shù)據(jù):"+mySequence.search("list"));
        System.out.println("contains查找一個(gè)數(shù)據(jù):"+mySequence.contains("list"));
        System.out.println();

        System.out.println("查找某一個(gè)位置對(duì)應(yīng)的值:"+mySequence.getPos(9));
        System.out.println();

        System.out.println("刪除一個(gè)數(shù)據(jù):"+mySequence.remove(8));
        mySequence.display();
        System.out.println();

        System.out.println("得到順序表的長度:"+mySequence.size());
    }
}

測試結(jié)果:

如何使用Java實(shí)現(xiàn)順序表的操作

以上是“如何使用Java實(shí)現(xiàn)順序表的操作”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI