數據結構*集合框架順序表-ArrayList

集合框架

常見的集合框架
在這里插入圖片描述
在這里插入圖片描述

什么是順序表

順序表是一種線性表數據結構,它借助一組連續的存儲單元來依次存儲線性表中的數據元素。一般情況下采用數組存儲。 在數組上完成數據的增刪查改。

自定義簡易版的順序表

代碼展示:

public interface IArrayList {//新增元素,默認在數組最后新增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 toRemove);//獲取順序表?度int size();//清空順序表void clear();
}
import java.util.Arrays;public class MyArrayList implements IArrayList {private int useSize;private int[] elem;public MyArrayList() {this.elem = new int[Constant.DEFAULT_CAPACITY];}@Override//新增元素,默認在數組最后新增public void add(int data) {//1、是否能繼續存放數據,不能就進行擴容if(isFill()) {grow();}//2、在數組末尾添加數據this.elem[useSize] = data;this.useSize++;}@Override//在 pos 位置新增元素public void add(int pos, int data) {//1、是不是滿的if(isFill()) {grow();}//2、檢查pos位置的合法性checkPosAdd(pos);//3、移動數據for (int i = useSize - 1; i >= pos ; i--) {elem[i+1] = elem[i];}/*if (useSize - pos >= 0) {System.arraycopy(elem, pos, elem, pos + 1, useSize - pos);}*/elem[pos] = data;useSize++;}private void checkPosAdd(int pos) {if(pos < 0 || pos > this.useSize) {throw new PosException(Constant.ADD_CHECK_MASSAGE);}}@Override//判定是否包含某個元素public boolean contains(int toFind) {for (int i = 0; i < this.useSize; i++) {if(elem[i] == toFind) {return true;}}return false;}@Override//查找某個元素對應的位置public int indexOf(int toFind) {for (int i = 0; i < this.useSize; i++) {if(elem[i] == toFind) {return i;}}return 0;}@Override//獲取 pos 位置的元素public int get(int pos) {//1、判斷順序表是否為空if(isEmpty()) {throw new isEmptyException(Constant.EMPTY_MASSAGE);}//2、判斷pos位置是否合法checkPos(pos);return elem[pos];}private void checkPos(int pos) {if(pos < 0 || pos >= this.useSize) {throw new PosException(Constant.GET_CHECK_MASSAGE);}}@Override//給 pos 位置的元素設為 valuepublic void set(int pos, int value) {if(isEmpty()) {throw new isEmptyException(Constant.EMPTY_MASSAGE);}checkPos(pos);elem[pos] = value;}@Override//刪除第?次出現的關鍵字keypublic void remove(int toRemove) {if(isEmpty()) {throw new isEmptyException(Constant.EMPTY_MASSAGE);}int index = indexOf(toRemove);if(index == -1) {System.out.println("沒有你要刪除的數據");return;}for (int i = index; i < this.useSize - 1; i++) {elem[i] = elem[i+1];}elem[useSize - 1] = 0;useSize--;}@Override//獲取順序表?度public int size() {return this.useSize;}@Override//清空順序表public void clear() {for (int i = 0; i < this.useSize; i++) {this.elem[i] = 0;}this.useSize = 0;}//是否為空private boolean isEmpty() {return useSize == 0;}//是否存滿private boolean isFill() {return this.useSize == this.elem.length;//判斷有效數據是否等于總數組長度}//數據擴容private void grow() {this.elem = Arrays.copyOf(this.elem,elem.length*2);}@Overridepublic String toString() {return Arrays.toString(elem);}
}
public class PosException extends RuntimeException{public PosException() {super();}public PosException(String message) {super(message);}
}
public class isEmptyException extends RuntimeException{public isEmptyException() {super();}public isEmptyException(String message) {super(message);}
}
public class Constant {public static final int DEFAULT_CAPACITY = 5;public static final String EMPTY_MASSAGE = "順序表為空";public static final String GET_CHECK_MASSAGE = "get方法的pos位置不合法";public static String ADD_CHECK_MASSAGE = "add方法的pos位置不合法";
}
public class Test {public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(1);myArrayList.add(2);myArrayList.add(3);myArrayList.add(4);myArrayList.add(2,10);myArrayList.add(2,10);System.out.println(myArrayList.contains(9));System.out.println(myArrayList.get(0));myArrayList.set(1,20);myArrayList.remove(10);System.out.println(myArrayList.size());System.out.println(myArrayList);myArrayList.clear();System.out.println(myArrayList);}
}

代碼解釋:

1、定義了一個IArrayList接口,里面有需要實現的方法。
2、Constant類用來存放一些常量。
3、自定義了一個MyArrayList順序表。useSize表示數據中的有效長度,elem[]表示存儲數據的數組。在構造方法中初始化了數組的默認大小。實現了如下方法:

方法功能
void add(int data)新增元素,默認在數組最后面新增
void add(int pos,int data)在pos位置新增元素
boolean contains(int toFind)判斷是否包含某個元素
int indexOf(int toFind)查找某個元素對應的位置
int get(int pos)獲得pos位置的元素
void set(int pos,int value)給pos位置的元素設為value
void remove(int toRemove)刪除第一次出現的關鍵字toRemove
int size()獲得順序表長度
void clear()清空順序表
4、兩個自定義異常,分別表示數組中沒有元素、pos位置不合法。
5、對于數據結構來說是很嚴謹的,需要考慮各種情況。將可能發生的情況進行書寫。

官方定義的順序表-ArrayList

類的屬性

在這里插入圖片描述

構造方法

有三種構造方法

無參構造方法

在這里插入圖片描述

public static void test1() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add("Hello");//報錯System.out.println(arrayList);List<String> list = new ArrayList<>();//向上轉型list.add("Hello");list.add("World");System.out.println(list);
}

此時new的是一個空的列表。arrayList已經限定為Integer類型,不能接收String類型。
對于add方法,查看源碼:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
grow方法就是擴容操作,完成的是1.5倍擴容。

指定順序表初始容量

在這里插入圖片描述

public static void test2() {ArrayList<Integer> arrayList = new ArrayList<>(20);arrayList.add(10);arrayList.add(20);arrayList.add(30);System.out.println(arrayList);
}

利用其他Collection構建ArrayList

在這里插入圖片描述

public static void test3() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);System.out.println(arrayList);ArrayList<Integer> arrayList1 = new ArrayList<>(arrayList);arrayList1.add(10);System.out.println(arrayList1);ArrayList<Number> arrayList2 = new ArrayList<>(arrayList);arrayList2.add(100);System.out.println(arrayList2);System.out.println(arrayList1);ArrayList<String> stringArrayList = new ArrayList<>(arrayList);//報錯
}

輸出:
[1]
[1, 10]
[1, 100]
[1, 10]

說明這種構造方法是創建一個新(單獨)的列表,并繼承傳入的列表已有的值。

ArrayList常見操作

方法功能
boolean add(E e)尾插e
void add(int index,E element)將e插入到index位置
boolean addAll(Collection<? extends E> c)尾插c中的元素
E remove(int index)刪除index位置元素
boolean remove(Object o)刪除遇到的第一個o
E get(int index)獲取下標index位置元素
E set(int index,E element)將下標index位置元素設置為element(替換)
void clear()清空
boolean contains(Object o)判斷o是否在線性表中
int indexOf(Object o)返回第一個o所在下標
int lastindexOf(Object o)返回最后一個o所在下標
List<E> subList(int fromIndex,int toIndex)截取部分list

代碼案例:

import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(4,10);System.out.println(arrayList);//arrayList.add(6,10);//報錯,IndexOutOfBoundsExceptionArrayList<Integer> arrayList1 = new ArrayList<>();arrayList1.addAll(arrayList);System.out.println(arrayList1);arrayList1.add(5);System.out.println(arrayList);System.out.println("===========");arrayList.remove(4);System.out.println(arrayList);System.out.println("===========");Integer i = 4;arrayList.remove(i);System.out.println(arrayList);System.out.println("===========");System.out.println(arrayList.get(2));System.out.println("===========");arrayList.set(1,100);System.out.println(arrayList);System.out.println("===========");System.out.println(arrayList.contains(10));System.out.println("===========");ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);list.add(8);list.add(9);list.add(10);System.out.println(list);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]List<Integer> sublist = list.subList(2, 7);System.out.println(sublist);//[3, 4, 5, 6, 7]sublist.set(0,100);System.out.println(sublist);//[100, 4, 5, 6, 7]System.out.println(list);//[1, 2, 100, 4, 5, 6, 7, 8, 9, 10]}
}

代碼解釋:

需要注意的是:
1、subList()方法截取的范圍是 [ fromeIndex,toIndex )
2、這里的截取并不是創建一個新的順序表,而是獲取原表上fromeIndex的地址。所以修改的是原表上的值。

ArrayList的遍歷

代碼案例:

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);System.out.println("--------for循環遍歷--------");for(int i = 0; i < list.size();i++) {System.out.print(list.get(i)+" ");}System.out.println();System.out.println("--------foreach循環遍歷--------");for (Integer integer : list) {System.out.print(integer + " ");}System.out.println();System.out.println("--------迭代器正序輸出1--------");Iterator<Integer> it = list.listIterator();while (it.hasNext()) {System.out.print(it.next()+" ");}System.out.println();System.out.println("--------迭代器正序輸出2--------");ListIterator<Integer> its = list.listIterator();while (its.hasNext()) {System.out.print(its.next()+" ");}System.out.println();System.out.println("--------迭代器正序輸出3(從指定下標位置輸出)--------");ListIterator<Integer> itss = list.listIterator(2);while (itss.hasNext()) {System.out.print(itss.next()+" ");}System.out.println();System.out.println("--------迭代器逆序輸出--------");ListIterator<Integer> reits = list.listIterator(list.size());while (reits.hasPrevious()) {System.out.print(reits.previous()+" ");}
}

輸出:
--------for循環遍歷--------
1 2 3 4 5 6 7
--------foreach循環遍歷--------
1 2 3 4 5 6 7
--------迭代器正序輸出1--------
1 2 3 4 5 6 7
--------迭代器正序輸出2--------
1 2 3 4 5 6 7
--------迭代器正序輸出3從指定下標位置輸出--------
3 4 5 6 7
--------迭代器逆序輸出--------
7 6 5 4 3 2 1

代碼解釋:

1、list.listIterator() 是調用 list 對象的方法來獲取一個列表迭代器。it.hasNext() 是判斷迭代器 it 是否還有下一個元素。it.next() 方法會返回迭代器指向的下一個元素(即列表中的下一個 Integer 元素)。
2、實現了Iterator接口就能使用迭代器進行打印。
3、ListIterator接口繼承了Iterator接口,也就是說有更多的方法。

嵌套列表

代碼案例

1、

public static void test() {List<List<Integer>> list = new ArrayList<>();List<Integer> list0 = new ArrayList<>();list0.add(10);list0.add(100);list0.add(1000);List<Integer> list1 = new ArrayList<>();list1.add(20);list1.add(200);List<Integer> list2 = new ArrayList<>();list2.add(30);list2.add(300);List<Integer> list3 = new ArrayList<>();list3.add(40);list3.add(400);list3.add(4000);List<Integer> list4 = new ArrayList<>();list4.add(50);list4.add(500);list.add(list0);list.add(list1);list.add(list2);list.add(list3);list.add(list4);for(int i = 0; i < list.size();i++) {for (int j = 0; j < list.get(i).size(); j++) {System.out.print(list.get(i).get(j)+" ");}System.out.println();}System.out.println();
}

輸出:
10 100 1000
20 200
30 300
40 400 4000
50 500

關系大致如圖所示:
在這里插入圖片描述
2、

public static List<List<Integer>> generate(int numRows) {List<List<Integer>> ret = new ArrayList<>();//定義起始行List<Integer> list0 = new ArrayList<>();list0.add(1);ret.add(list0);//定義后面的行for (int i = 1; i < numRows; i++) {//定義每行列表List<Integer> currentRow = new ArrayList<>();//第一個元素都是1currentRow.add(1);//中間操作List<Integer> preRow = ret.get(i - 1);for (int j = 1; j < i; j++) {//按照規律添加元素currentRow.add(preRow.get(j) + preRow.get(j-1));}//每行最后一個元素都是1currentRow.add(1);//currentRow行存儲到ret中ret.add(currentRow);}return ret;
}public static void main(String[] args) {List<List<Integer>> list = generate(5);for (List<Integer> integers : list) {for (Integer integer : integers) {System.out.print(integer + " ");}System.out.println();}System.out.println();
}

關系大致如圖所示:
在這里插入圖片描述

代碼解釋:

1、本質上是一個二維列表,可用于存儲和操作二維數據結構。
2、代碼二,實現的是楊輝三角的輸出。

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

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

相關文章

使用openpyxl時的一些注意點

一、是否需要close()&#xff1f; 在使用 openpyxl 時&#xff0c;wb.save() 后一般不需要再手動調用 wb.close()。wb.save() 會自動處理文件寫入和釋放。 如果是使用openpyxl.load_workbook(filename, read_onlyTrue) 打開了一個只讀模式的工作簿&#xff0c;此時會建立文件…

Python爬蟲第11節-解析庫Beautiful Soup的使用上篇

目錄 前言 一、Beautiful Soup 簡介 1.1 Beautiful Soup概述 1.2 準備工作 1.3 解析器 二、基本使用 三、節點選擇器的使用 3.1 選擇元素 3.2 提取信息 3.2.1 獲取名稱 3.2.2 獲取屬性 3.2.3 獲取內容 3.3 嵌套選擇 3.4 關聯選擇 3.4.1 子節點和子孫節點 3.4.2…

【Docker-13】Docker Container容器

Docker Container&#xff08;容器&#xff09; 一、什么是容器&#xff1f; 通俗地講&#xff0c;容器是鏡像的運行實體。鏡像是靜態的只讀文件&#xff0c;而容器帶有運行時需要的可寫文件層&#xff0c;并且容器中的進程屬于運行狀態。即容器運行著真正的應用進程。容器有…

Spring Cache(筆記)

簡介&#xff1a; 常用注解&#xff1a;

大模型Qwen32b(FP16精度)部署所需的顯存大小和并發數計算分析

大家好&#xff0c;我是微學AI&#xff0c;今天給大家介紹一下大模型Qwen32b(FP16精度)部署所需的顯存大小和并發計算分析。 文章目錄 1. 大模型顯存需求分析1.1 模型參數與顯存占用1.2 不同精度對顯存的影響 2. 不同顯卡配置下的并發能力2.1 80G顯卡并發能力2.2 64G顯卡并發能…

【euclid】10.2 2D變換模塊(transform2d.rs)Arbitrary trait

源碼 #[cfg(feature "arbitrary")] impl<a, T, Src, Dst> arbitrary::Arbitrary<a> for Transform2D<T, Src, Dst> whereT: arbitrary::Arbitrary<a>, {fn arbitrary(u: &mut arbitrary::Unstructured<a>) -> arbitrary::Res…

MAC Mini M4 上測試Detectron2 圖像識別庫

斷斷續續地做圖像識別的應用&#xff0c;使用過各種圖像識別算法&#xff0c;一開始使用openCV 做教室學生計數的程序。以后又使用YOLO 做醫學傷口檢測程序。最近&#xff0c;開始使用meta 公司的Detectron2.打算做OCR 文檔結構分析 Detectron2 的開發者是 Meta 的 Facebook AI…

一天時間,我用AI(deepseek)做了一個配色網站

前言 最近在開發顏色搭配主題的相關H5和小程序&#xff0c;想到需要補充一個web網站&#xff0c;因此有了這篇文章。 一、確定需求 向AI要答案之前&#xff0c;一定要清楚自己想要做什么。如果你沒有100%了解自己的需求&#xff0c;可以先讓AI幫你理清邏輯和思路&#xff0c;…

機器視覺用消色差雙合透鏡

光學系統案例&#xff1a;機器視覺用消色差雙合透鏡 一、設計規格 1. 應用場景&#xff1a;專為工業相機成像而設計&#xff0c;工作于可見光波段&#xff0c;旨在滿足該領域對高精度成像的需求。 2. 核心參數&#xff1a; ? 焦距&#xff1a;精確要求達到 50 mm 1%&#…

批量歸一化(Batch Normalization)原理與PyTorch實現

批量歸一化&#xff08;Batch Normalization&#xff09;是加速深度神經網絡訓練的常用技術。本文通過Fashion-MNIST數據集&#xff0c;演示如何從零實現批量歸一化&#xff0c;并對比PyTorch內置API的簡潔實現方式。 1. 從零實現批量歸一化 1.1 批量歸一化函數實現 import t…

feedback

這個文件 lib/pages/feedback/index.dart 是一個反饋/留言表單頁面的實現&#xff0c;主要功能是&#xff1a; 表單收集功能&#xff1a; 真實姓名&#xff08;必填&#xff09;聯系電話&#xff08;必填&#xff0c;需要驗證手機號格式&#xff09;電子郵箱&#xff08;選填&a…

數據倉庫標準庫模型架構相關概念淺講

數據倉庫與模型體系及相關概念 數據倉庫與數據庫的區別可參考&#xff1a;數據庫與數據倉庫的區別及關系_數據倉庫和數據庫-CSDN博客 總之&#xff0c;數據庫是為捕獲數據而設計&#xff0c;數據倉庫是為分析數據而設計 數據倉庫集成工具 在一些大廠中&#xff0c;其會有自…

適用于 HAL 的 AIDL

目錄 設計初衷 注意 編寫AIDLHAL接口 查找AIDLHAL接口 擴展接口 將現有HAL從HIDL轉換為AIDL AIDL與HIDL之間的主要差異 針對HAL的供應商測試套件(VTS)測試 Android 11 中引入了在 Android 中使用 AIDL 實現 HAL 的功能, 從而可以在不使用 HIDL 的情況下實現 Android 的部分…

leetcode0547. 省份數量-medium

1 題目&#xff1a;省份數量 官方標定難度&#xff1a;中 有 n 個城市&#xff0c;其中一些彼此相連&#xff0c;另一些沒有相連。如果城市 a 與城市 b 直接相連&#xff0c;且城市 b 與城市 c 直接相連&#xff0c;那么城市 a 與城市 c 間接相連。 省份 是一組直接或間接相…

【專題刷題】雙指針(一)

&#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄&#xff0c;按專題劃分每題主要記錄&#xff1a;1&#xff0c;本人解法 本人屎山代碼&#xff1b;2&#xff0c;優質解法 優質代碼&#xff1b;3&#xff0c;精益求精&#xff0c;…

WebSocket 技術詳解

引言 在現代Web應用中&#xff0c;實時通信已經成為不可或缺的一部分。想象一下聊天應用、在線游戲、股票交易平臺或協作工具&#xff0c;這些應用都需要服務器能夠即時將更新推送給客戶端&#xff0c;而不僅僅是等待客戶端請求。WebSocket技術應運而生&#xff0c;它提供了一…

【redis】初識redis

初識redis Redis 是一種基于鍵值對&#xff08;key-value&#xff09; 的 NoSQL 的數據庫&#xff0c;它與很多鍵值數據庫不同&#xff0c; Redis 中的值可以是 string&#xff08;字符串&#xff09; 、hash&#xff08;哈希&#xff09;、list&#xff08;鏈表&#xff09;、…

UE5 制作方塊邊緣漸變邊框效果

該效果基于之前做的&#xff08;https://blog.csdn.net/grayrail/article/details/144546427&#xff09;進行修改得到&#xff0c;思路也很簡單&#xff1a; 1.打開實時預覽 1.為了制作時每個細節調整方便&#xff0c;勾選Live Update中的三個選項&#xff0c;開啟實時預覽。…

基于springboot的“嗨玩旅游網站”的設計與實現(源碼+數據庫+文檔+PPT)

基于springboot的“嗨玩旅游網站”的設計與實現&#xff08;源碼數據庫文檔PPT) 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;springboot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 系統功能結構圖 局部E-R圖 系統首頁界面 系統注冊…

grafana/loki 部署搜集 k8s 集群日志

grafana/loki 和 grafana/loki-stack 的區別 ?Grafana 提供了多個 Helm Chart 用于在 Kubernetes 集群中部署 Loki 及相關組件,其中主要包括 grafana/loki 和 grafana/loki-stack。?它們的主要區別如下:? 1.grafana/loki Helm Chart: 專注于 Loki 部署: 該 Chart 專門…