【數據結構】 List與順序表及接口的實現

文章目錄

  • 什么是List
  • 常見接口介紹
  • 線性表
  • 順序表
    • 順序表接口的實現
      • add在末尾新增元素
      • 在 pos 位置新增元素
      • 判定是否包含某個元素
      • 查找某個元素對應的位置
      • 獲取 pos 位置的元素
      • 給 pos 位置的元素設為 value
      • 刪除第一次出現的關鍵字key
      • 獲取順序表的長度
      • 清空順序表
  • 順序表的優缺點
    • 優點:
    • 缺點:
  • 總結

什么是List

在集合框架中,List是一個接口,繼承自Collection。
在這里插入圖片描述
Collection也是一個接口,該接口中規范了后序容器中常用的一些方法,具體如下所示:
在這里插入圖片描述
Iterable也是一個接口,表示實現該接口的類是可以逐個元素進行遍歷的,具體如下:
在這里插入圖片描述
List 的官方文檔

站在數據結構的角度來看,List就是一個線性表,即n個具有相同類型元素的有限序列,在該序列上可以執行增刪改查以及變量等操作。

常見接口介紹

List中提供了好的方法,具體如下:
在這里插入圖片描述
雖然方法比較多,但是常用方法如下:
在這里插入圖片描述
注意:List是個接口,并不能直接用來實例化

線性表

線性表(linear list)是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構,常見的線性表:順序表、鏈表、棧、隊列…

線性表在邏輯上是線性結構,也就說是連續的一條直線。但是在物理結構上并不一定是連續的,線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲
在這里插入圖片描述

順序表

順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,一般情況下采用數組存儲。

在數組上完成數據的增刪查改

順序表接口的實現

我們現在有這樣一個SepList接口為:

public interface SepList  {// 新增元素,默認在數組最后新增void add(int data);// 在 pos 位置新增元素void add(int pos, int data);// 判定是否包含某個元素boolean contains(int toFind);// 查找某個元素對應的位置int indexOf(int toFind);// 獲取 pos 位置的元素int get(int pos);// 給 pos 位置的元素設為 valuevoid set(int pos, int value);//刪除第一次出現的關鍵字keyvoid remove(int key);// 獲取順序表長度int size();// 清空順序表void clear();
}

這里博主將在一個MyArrayList類里面實現這些接口

public class MyArrayList implements SepList  {private int[] elem;//數組private int usedSize;//記錄有效的數據的個數private static final int DEFAULT_SIZE = 10;//最初的數據容量public MyArrayList() {this.elem = new int[DEFAULT_SIZE];}// 新增元素,默認在數組最后新增public void add(int data) { }// 在 pos 位置新增元素public void add(int pos, int data) { }// 判定是否包含某個元素public boolean contains(int toFind) { return true; }// 查找某個元素對應的位置public int indexOf(int toFind) { return -1; }// 獲取 pos 位置的元素public int get(int pos) { return -1; }// 給 pos 位置的元素設為 valuepublic void set(int pos, int value) { }//刪除第一次出現的關鍵字keypublic void remove(int key) { }// 獲取順序表長度public int size() { return 0; }// 清空順序表public void clear() { }
}

add在末尾新增元素

在增加一個元素前,我們需要對該順序表進行判斷,判斷是否已滿,若滿則需要進行擴容

每增加一個元素,我們我們記錄有效個數的usedSize加1

// 新增元素,默認在數組最后新增public void add(int data) {//判斷數組是否已經被裝滿if(usedSize >= this.elem.length) {//被裝滿后需要進行擴容this.elem = Arrays.copyOf(this.elem,2*this.elem.length);}this.elem[this.usedSize] = data;usedSize++;}

在 pos 位置新增元素

在增加一個元素前,我們需要對該順序表進行判斷,判斷是否已滿,若滿則需要進行擴容

我們還需要多pos進行一個判斷,判斷它是否合法,如果不合法,我們拋出異常進行提醒
在這里插入圖片描述

在pos位置增加元素,需要將pos位置及以后的元素進行后移一位,然后再在pos位置新增元素
在這里插入圖片描述

每增加一個元素,我們我們記錄有效個數的usedSize加1

//自定義異常
class PosWrongfulException extends RuntimeException {public PosWrongfulException(String message) {super(message);}
}// 在 pos 位置新增元素public void add(int pos, int data) throws PosWrongfulException {//判斷數組是否已經被轉滿if(usedSize >= this.elem.length) {//被裝滿后需要進行擴容this.elem = Arrays.copyOf(this.elem,2*this.elem.length);}if(pos < 0 || pos > this.usedSize) {System.out.println("pos位置不合法!");throw new PosWrongfulException("pos位置不合法");}for(int i = this.usedSize;i >= pos;i--) {//pos位置以及pos位置以后的數據整體進行后移this.elem[i] = this.elem[i-1];}this.elem[pos] = data;usedSize++;}

判定是否包含某個元素

遍歷即可

// 判定是否包含某個元素public boolean contains(int toFind) {for(int i = 0;i < this.usedSize;i++) {if(this.elem[i] == toFind) {return true;}}return false;}

查找某個元素對應的位置

對數組進行遍歷,有的話返回相應的數組下標就好,沒有返回-1

// 查找某個元素對應的位置public int indexOf(int toFind) {for(int i = 0;i < this.usedSize;i++) {if(this.elem[i] == toFind) {return i;}}return -1;}

獲取 pos 位置的元素

獲取前我們得進行判斷,該順序表類元素不能為空

我們還得對pos進行是否合法得判斷

//自定義的異常
class PosWrongfulException extends RuntimeException {public PosWrongfulException(String message) {super(message);}
}
class EmptyException extends RuntimeException {public EmptyException(String message) {super(message);}
}// 獲取 pos 位置的元素public int get(int pos)throws PosWrongfulException {if(this.usedSize == 0){throw new EmptyException("當前順序表為空!");}if(pos < 0 || pos > this.usedSize) {System.out.println("pos位置不合法!");throw new PosWrongfulException("pos位置不合法");}return this.elem[pos];}

給 pos 位置的元素設為 value

我們依舊需要判斷pos的合法性,前面已經自定義了該異常,這里就不再進行定義了

然后將pos位置的元素改為value就好

// 給 pos 位置的元素設為 valuepublic void set(int pos, int value) {if(pos < 0 || pos > this.usedSize) {System.out.println("pos位置不合法!");throw new PosWrongfulException("pos位置不合法");}this.elem[pos] = value;}

刪除第一次出現的關鍵字key

我們依舊需要判斷數組是否為空

遍歷數組,若沒有我們要刪除的元素,我們便進行提示后退出

若有,則只需要用后面的數據對前面進行覆蓋就好

 //刪除第一次出現的關鍵字keypublic void remove(int key) {if(this.usedSize == 0) {throw new EmptyException("順序表為空!");}int index = this.indexOf(key);if(index == -1) {System.out.println("沒有這個數字");return;}//進行覆蓋for (int i = index; i < size()-1; i++) {this.elem[i] = this.elem[i+1];}//如果不是基本類型,將usedSize下標置為空//this.elem[this.usedSize] = null;this.usedSize--;}

獲取順序表的長度

這個就非常簡單了,只需要返回usedSize就好

 // 獲取順序表長度public int size() {  return this.usedSize;}

清空順序表

對于當前基本類型的數據來說,只需要將usedSize置為0就好

 public void clear() {this.usedSize=0;}

順序表的優缺點

線性表的順序存儲結構,在存、讀數據時,不管是哪個位置,時間復雜度都是O(1);而插入或刪除時,時間復雜度都是O(n)。這就說明,它比較適合元素個數不太變化,而更多是存取數據的應用。當然,它的優缺點還不只這些……

優點:

無需為表示表中元素之間的邏輯關系而增加額外的存儲空間可以快速地存取表中任一位置的元素

缺點:

插入刪除操作需要移動大量元素,當線性表長度變化較大時,難以確定存儲空間的容量,造成存儲空間的碎片

總結

關于《【數據結構】 List與順序表及接口的實現》就講解到這兒,感謝大家的支持,歡迎各位留言交流以及批評指正,如果文章對您有幫助或者覺得作者寫的還不錯可以點一下關注,點贊,收藏支持一下!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40230.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全面掌握 Jaeger 分布式調用鏈路跟蹤理論和實戰,Go 為所有使用 go-resty 庫發起 HTTP 請求集成鏈路跟蹤 jaeger(附源碼)

全面掌握 Jaeger 分布式調用鏈路跟蹤理論和實戰,Go 為所有使用 go-resty 庫發起 HTTP 請求集成鏈路跟蹤 jaeger(附源碼)。 介紹一個開源的分布式跟蹤系統 Jaeger,首先從理論基礎知識開始學習,將學習如何在 HTTP 請求中集成鏈路跟蹤,以及如何在 GORM 框架實現,最后學習 …

Qt應用開發(基礎篇)——滾屏區域基類 QAbstractScrollArea

一、前言 QAbstractScrollArea滾屏區域抽象類繼承于QFrame&#xff0c;QFrame繼承于QWidget&#xff0c;是QListview(列表瀏覽器)、QTableview(表格瀏覽器)、QTextEdit(文本編輯器)、QTextBrowser(文本瀏覽器)等所有需要滾屏區域部件的抽象基類。 框架類QFrame介紹 QAbstractSc…

java -jar 啟動服務后,關閉命令窗口后服務停止

java -jar 啟動服務后&#xff0c;關閉命令窗口后服務停止 問題&#xff1a;當我們用java -jar命令啟動服務后&#xff0c;只有一直保持Xshell的窗口開啟且正常連接服務器時才能訪問服務&#xff0c;當關閉命令窗口時&#xff0c;服務會停止運行 解決&#xff1a;使用nohup命…

java之juc二

JMM 請你談談對Volatile的理解 Volatile是jvm提供的輕量級的同步機制&#xff08;和synchronized差不多&#xff0c;但是沒有synchronized那么強大&#xff09; 保證可見性不保證原子性禁止指令重排 什么是JMM JMM&#xff1a;java內存模型&#xff0c;不存在的東西&#…

常用Linux命令

常用Linux命令 1. 基本命令 uname -m 顯示機器的處理器架構 uname -r 顯示正在使用的內核版本 dmidecode -q 顯示硬件系統部件 (SMBIOS / DMI) hdparm -i /dev/hda 羅列一個磁盤的架構特性 hdparm -tT /dev/sda 在磁盤上執行測試性讀取操作系統信息 arch 顯示機器的處理器架構…

一.RocketMQ概念

RocketMQ概念 1.概念2.應用場景3.MQ的優點和缺點4.常見MQ對比 1.概念 MQ(Message Queue)&#xff0c;是一種提供消息隊列服務的中間件&#xff0c;也稱為消息中間件&#xff0c;是一套提供了消息生產、存儲、消費全過程API的軟件系統。 RocketMQ是阿里巴巴2016年MQ中間件&…

Error: Couldn‘t find preset “es2015“ relative to directory

vue引入element-ui&#xff0c;運行時報了這個錯誤 Module build failed: Error: Couldnt find preset "es2015" relative to directory "D:\\360MoveData\\Users\\Administrator\\Desktop\\新建文件夾\\henge-test"at D:\360MoveData\Users\Administrato…

華為云classroom賦能--Devstar使應用開發無需從零開始

華為云DevStar為開發者提供業界主流框架代碼初始化能力&#xff0c;通過GUI、API、CLI等多種方式&#xff0c;將按模板生成框架代碼的能力推送至用戶桌面。同時基于華為云服務資源、成熟的DevOps開發工具鏈和面向多場景的眾多開發模板&#xff0c;提供一站式創建代碼倉、自動生…

Windows server 2016如何安裝OpenSSH

在 Windows Server 2016 上安裝 OpenSSH 需要通過“添加功能和角色”向導來完成。以下是安裝 OpenSSH 的步驟&#xff1a; 1.打開 Windows Server 2016 控制面板。 2.點擊 "程序"&#xff0c;然后選擇 "程序和功能"。 3.在左側菜單中&#xff0c;點擊 &…

【golang】數組和切片底層原理

數組類型的值&#xff08;以下簡稱數組&#xff09;的長度是固定的&#xff0c;而切片類型的值&#xff08;以下簡稱切片&#xff09;是可變長的。 數組的長度在聲明它的時候就必須給定&#xff0c;并且之后不會再改變。可以說&#xff0c;數組的長度是其類型的一部分。比如&a…

Spring學習筆記之Spring IoC注解式開發

文章目錄 聲明Bean的注解Component注解Controller注解Service注解Repository Spring注解的使用選擇性實例化Bean負責注入的注解ValueAutowired與QuaifierResource 全注解式開發 注解的存在主要是為了簡化XML的配置。Spring6倡導全注解開發 注解怎么定義&#xff0c;注解中的屬性…

深入探索JavaEE單體架構、微服務架構與云原生架構

課程鏈接&#xff1a; 鏈接: https://pan.baidu.com/s/1xSI1ofwYXfqOchfwszCZnA?pwd4s99 提取碼: 4s99 復制這段內容后打開百度網盤手機App&#xff0c;操作更方便哦 --來自百度網盤超級會員v4的分享 課程介紹&#xff1a; &#x1f50d;【00】模塊零&#xff1a;開營直播&a…

ARM-M0內核MCU,內置24bit ADC,采樣率4KSPS,傳感器、電子秤、體脂秤專用,國產IC

ARM-M0內核MCU 內置24bit ADC &#xff0c;采樣率4KSPS flash 64KB&#xff0c;SRAM 32KB 適用于傳感器&#xff0c;電子秤&#xff0c;體脂秤等等

[BitSail] Connector開發詳解系列三:SourceReader

更多技術交流、求職機會&#xff0c;歡迎關注字節跳動數據平臺微信公眾號&#xff0c;回復【1】進入官方交流群 Source Connector 本文將主要介紹負責數據讀取的組件SourceReader&#xff1a; SourceReader 每個SourceReader都在獨立的線程中執行&#xff0c;只要我們保證Sou…

Jmeter進階使用:BeanShell實現接口前置和后置操作

一、背景 我們使用Jmeter做壓力測試或者接口測試時&#xff0c;除了最簡單的直接對接口發起請求&#xff0c;很多時候需要對接口進行一些前置操作&#xff1a;比如提前生成測試數據&#xff0c;以及一些后置操作&#xff1a;比如提取接口響應內容中的某個字段的值。舉個最常用…

c語言——拷貝數組

這段代碼是一個簡單的數組拷貝示例。它的功能是將一個原始數組 original 的內容拷貝到另一個數組 copied 中&#xff0c;并輸出兩個數組的元素。 代碼執行過程如下&#xff1a; 首先&#xff0c;在 main() 函數中定義了一個整型數組 original&#xff0c;并初始化了它的元素。…

【ARM 嵌入式 編譯 Makefile 系列 15 - Makefile define 宏與調用宏函數詳細介紹】

文章目錄 Makefile define 宏與調用宏函數帶參數的宏函數帶返回值的宏函數Makefile define 宏與調用宏函數 在Makefile中,可以通過define關鍵字來定義一個多行的宏(也稱為變量)。這種宏定義通常用于定義一個復雜的命令序列,然后在其他地方調用。 以下是定義一個宏的例子:…

物聯網在制造業中的應用

制造業目前正在經歷第四次工業革命&#xff0c;物聯網、人工智能和機器人等技術進步正在推動行業的發展。研究表明&#xff0c;到2024年&#xff0c;全球制造商將在物聯網解決方案上投資700億美元&#xff0c;許多制造商正在實施物聯網設備&#xff0c;以利用預測性維護和復雜的…

接口測試工具——Postman測試工具 Swagger接口測試+SpringBoot整合 JMeter高并發測試工具

目錄 Postman測試工具接口測試工具swaggerKnife4j1.引入依賴2.配置3.常用注解4.接口測試 JMeter什么是JMeter?JMeter安裝配置1.官網下載2.下載后解壓3.漢語設置 JMeter的使用方法1.新建線程組2.設置參數3.添加取樣器4.設置參數&#xff1a;協議&#xff0c;ip&#xff0c;端口…

SDK是什么,SDK和API有什么區別

SDK&#xff08;Software Development Kit&#xff09;是一種開發工具包&#xff0c;通常由軟件開發公司或平臺提供&#xff0c;用于幫助開發人員構建、測試和集成特定平臺或軟件的應用程序。SDK 包含一系列的庫、工具、示例代碼和文檔&#xff0c;旨在簡化開發過程并提供所需的…