week 3 - More on Collections - Lecture 3

一、Motivation


1.?? ?Java支持哪種類型的一維數據結構?
Java中用于在單一維度中存儲數據的數據結構,如arrays or ArrayLists.


2.?? ?如何在Java下創建一維數據結構?(1-dimensional data structure)
定義和初始化這些一維數據結構

int[] arr = new int[10];

int[] numbers = {1, 2, 3, 4, 5}; ?// 使用初始化語法創建并賦值

<Integer> list = new ArrayList<>();用于動態列表


3.?? ?我們如何使用它們?如何maintain它們?
數組或列表中添加、刪除或訪問元素。

維數據結構主要包括對其進行動態管理和更新,包括擴展大小、添加新元素、刪除元素、檢查元素等操作


4.?? ?我們可以在Java下迭代一維數據結構嗎?
for或for-each這樣的循環來遍歷一維結構(如數組或列表)中的元素。

??數組用于固定大小的數據存儲,適用于已知大小且不需要頻繁擴展的場景。

??ArrayList?用于動態大小的數據存儲,適用于需要頻繁修改數據的場景。

二、Menu

??Collections and List

??Using List and ArrayList

??Iterators

三、Comments on code style????????代碼風格的注釋

1.?省略 this. 關鍵字

?一般情況下,我們不需要在方法調用前加上?this.,除非在構造函數或方法內部需要明確區分實例變量和局部變量時才使用。

??不推薦的寫法:this.loadFromFile(fname);

??推薦的寫法:loadFromFile(fname);

??Explanation: 在 Java 中,如果沒有命名沖突,通常不需要使用?this?關鍵字來調用實例方法或訪問實例變量。

2.?省略包含單一語句的花括號 {}

?如果?if、while?等控制語句只包含一個語句,那么可以省略 {},使代碼更加簡潔。

??不推薦的寫法

while (i < name.length) {
? ? name[i] = null;
}

??推薦的寫法

while (i < name.length)
? ? name[i] = null;

四、集合類型 (Collection Types)

?Java 集合框架?的接口和類的層次結構,并展示了如何使用它們來處理數據。

1.?接口

?Collection?是一個通用接口,表示一個元素集合,所有 Java 集合框架的實現都繼承自該接口。

?List?是?Collection?接口的子接口,表示一種有序集合,允許重復的元素。

2.?

?ArrayList?和?LinkedList?是實現了?List?接口的具體類,分別基于動態數組和鏈表結構。

3.?接口的繼承關系

??List?繼承自?Collection,并且它實現了多種有序的集合操作。例如,ArrayList<E>?是基于動態數組實現的,而?LinkedList<E>?是基于鏈表實現的。

4.?子接口擴展

??子接口(如?List)會繼承父接口(如?Collection)的方法,并且可以添加自己的特有方法。

The?sub?interface has all the methods of the?super?interface

五、Methods on Collection and List

1.?Collection 接口中的方法

??isEmpty(): 判斷集合是否為空,返回?boolean?類型。

??size(): 返回集合中元素的個數,返回?int?類型。

??contains(E elem): 判斷集合中是否包含指定元素,返回?boolean?類型。

??add(E elem): 向集合中添加元素,返回?boolean?類型,表示是否成功添加。

??remove(E elem): 移除集合中的指定元素,返回?boolean?類型,表示是否成功移除。

??iterator(): 返回一個迭代器對象,用于遍歷集合中的元素。

?// 獲取 Iterator 對象

? ? ? ??Iterator<String> iterator = list.iterator();

? ? ? ??// 使用迭代器遍歷元素

? ? ? ??while?(iterator.hasNext()) {

? ? ? ? ? ??String?fruit?= iterator.next();

? ? ? ? ? ??System.out.println(fruit);

? ? ? ??}

Iterator 接口?定義了三個常用方法:

1.?hasNext():檢查是否還有下一個元素。

2.?next():獲取下一個元素。

3.?remove():刪除當前元素(可選操作)。

?

2.?List 接口中的方法

E?代表的是?“元素”(Element)的泛型類型參數。它是一個通用的類型參數,通常用于表示集合中存儲的對象類型。比如,List<E>?就表示?一個可以存儲任意類型元素的列表

??add(int index, E elem): 在指定位置?index?插入元素?elem。

??remove(int index): 移除指定位置的元素,返回被移除的元素。

??get(int index): 獲取指定位置的元素,返回該元素。

??set(int index, E elem): 替換指定位置的元素,返回被替換的元素。

??indexOf(E elem): 返回指定元素在列表中的位置(索引),如果元素不存在則返回 -1。

??subList(int from, int to): 返回一個新的子列表,從?from?索引到?to?索引之間的元素。

六、使用集合類型 (Using a collection type)

1.?聲明集合類型變量

變量或字段應聲明為接口類型,而不是具體實現類。這是為了使代碼更加靈活,可以隨時更換具體的實現類(例如從?ArrayList?切換到?LinkedList)。

List?是一個接口,代表有序集合,它有多個具體的實現類,如?ArrayList?和?LinkedList。當你聲明一個集合類型時,最好使用接口類型(例如?List),而不是具體的實現類(例如?ArrayList?或?LinkedList)。

??示例:The type between “<“ and “>” is the type of the elements

// 聲明為 List 接口類型,具體實現可以是 ArrayList 或 LinkedList

private?List<Task> tasks;

// 創建具體實現對象時,可以選擇不同的實現類

tasks =?new?ArrayList<Task>();??// 使用 ArrayList 實現

// 或者

tasks =?new?LinkedList<Task>();??// 使用 LinkedList 實現

?這里的?List<Task>?表示任務的集合,Task?是任務對象的類型。

2.?創建集合對象

使用實現了集合接口的類來創建對象。比如,通過?ArrayList?或?LinkedList?來實現?List?接口。

??示例:

tasks = new ArrayList<Task>();

??這行代碼創建了一個?ArrayList?類型的?tasks?集合,存儲?Task?類型的元素。

3.?操作集合中的元素

??一旦創建了集合對象,就可以調用集合方法來訪問或修改集合中的元素,例如:

??add()?用于添加元素,

??remove()?用于刪除元素,

??get()?用于獲取元素等。

七、Example

1.?TodoList – 任務的集合

??TodoList?是一個任務集合,用于按順序管理需要完成的任務。任務按照它們應該完成的順序存儲在集合中。

集合的類型是?List,其中?Task?是任務對象的類型。

Collection type: List of tasks

2.?TodoList 的要求

??從文件中讀取任務列表:?可以通過文件存儲任務,并從中讀取任務列表。

??顯示所有任務:?提供一個方法來顯示當前所有的任務,確保任務列表是清晰的。

??添加任務:?可以在列表的末尾添加新任務,或者在指定的位置插入任務。

??刪除任務:?從列表中刪除指定的任務。

??移動任務:?將任務從一個位置移動到另一個位置,確保任務按順序執行。

實現了?ActionListener?接口的?TodoList?類。它的作用是從文件中讀取任務列表并存儲在?List<Task>?類型的集合中

public class?TodoList?implements?ActionListener{?

????????private?List<Task> tasks;

????????public?void?readTasks(String?fname){

? ? ? ? ? ? try?{

?????????????????????Scanner?sc =?new?Scanner(new?File(fname));

?????????????????????tasks =?new?ArrayList<Task>();

??????????????????????while?( sc.hasNext() )

????????????????????????????????tasks.add(new?Task(sc.next()));

??????????????????????sc.close();

????????}?catch(IOException?e){…}

????????displayTasks();

????????}

?

?askTask()?和?askIndex()?方法用于向用戶詢問任務內容或索引值。

3. Iterator 在 Java 中的應用?

(1)?for-each 循環轉為 Iterator:

for?(Task?task : tasks){

textArea.append(task +?"\n");

for-each 循環?本質上是?Iterator?的一種簡化寫法。

Iterator<Task> iter = tasks.iterator();
while (iter.hasNext()) {
? ? Task task = iter.next();
? ? textArea.append(task + "\n");
}

(2)?Iterator 接口:

??Iterator?接口有兩個主要方法:

??hasNext():檢查是否有下一個元素。

??next():返回下一個元素。

public interface Iterator<E> {
? ? public boolean hasNext();
? ? public E next();
}?

?使用?Iterator?遍歷?List<String>?中的元素。

for ( String str : items) System.out.print(str +?“, “);

Iterator<String>?iter = items.iterator();

while?(iter.hasNext()){

????????String?str = iter.next();

????????System.out.print(str +?“, “);

}

八、List 與數組(Array)的對比???????

1.?List 的優勢:

??沒有大小限制,可以根據需要自動增長。

??提供了很多內置方法,如?add()、get()、remove()?等,操作更加方便。

2.?數組的局限性:

??數組大小固定,不能動態擴展。如果需要改變數組的大小,必須創建新的數組。

??數組操作比較麻煩,尤其是需要處理元素的添加、刪除時,必須手動處理大小和位置的變動。

?

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

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

相關文章

Ubuntu 防火墻iptables和 ufw

文章目錄 iptables 和 ufw 的區別Ubuntu 上使用 ufw 配置 iptables 和 ufw 的區別 iptables 和 ufw 是 Linux 系統中用于管理防火墻的工具&#xff0c;但它們的設計目標和使用方式有所不同。 iptables&#xff1a;功能強大&#xff0c;適合高級用戶和復雜場景&#xff0c;但配…

(動態規劃 最長連續遞增子序列)leetcode 674

我上個文章提到了最長遞增子序列這個題可以去看看 這個題目翻譯人話就是找出最長的遞增子串&#xff0c;用一層for循環就行&#xff0c;時間復雜度是O(n) 比起上個題&#xff0c;一個范圍多條子序列&#xff08;路徑&#xff09;這里一個范圍只有一條遞增路徑&#xff0c;所以…

STM32CubeMx DRV8833驅動

一、DRV8833驅動原理 ? STBY口接單片機的IO口&#xff0c;STBY置0電機全部停止&#xff0c;置1才能工作。STBY置1后通過AIN1、AIN2、BIN1、BIN2 來控制正反轉。 AIN1AIN2電機狀態00停止1speed反轉speed1正轉11停止 其中A端&#xff08;AIN1與AIN2&#xff09;只能控制AO1與…

JSON Schema 入門指南:如何定義和驗證 JSON 數據結構

文章目錄 一、引言二、什么是 JSON Schema&#xff1f;三、JSON Schema 的基本結構3.1 基本關鍵字3.2 對象屬性3.3 數組元素3.4 字符串約束3.5 數值約束 四、示例&#xff1a;定義一個簡單的 JSON Schema五、使用 JSON Schema 進行驗證六、實戰效果6.1 如何使用 七、總結 一、引…

前端Npm面試題及參考答案

目錄 npm 是什么?它的主要作用是什么? npm 包管理工具與 Yarn 有何不同? npm 的 package.json 文件有哪些重要字段? 什么是 npm 依賴?如何在項目中安裝、更新和移除依賴? npm 的 node_modules 目錄是什么?它的作用是什么? 什么是 npm 腳本?如何在 package.json 中…

零樣本思維鏈(Zero-shot CoT)

Large Language Models are Zero-Shot Reasoners (Kojima et al., 2022) 這篇文章研究了大型語言模型 (LLMs) 在推理任務上的能力&#xff0c;并提出了一種名為 Zero-shot-CoT 的新方法&#xff0c;該方法能夠有效地引導 LLM 進行多步驟推理&#xff0c;并在各種推理任務上取得…

day01_Java基礎

文章目錄 day01_Java基礎一、今日課程內容二、Java語言概述&#xff08;了解&#xff09;1、Java語言概述2、為什么要學習Java語言3、Java平臺版本說明4、Java特點 三、Java環境搭建&#xff08;操作&#xff09;1、JDK和JRE的概述2、JDK的下載和安裝3、IDEA的安裝4、IDEA的啟動…

設計模式 之 生產消費者模型 (C++)

文章目錄 設計模式 之 生產消費者模型 &#xff08;C&#xff09;引言生產消費者模型的基本概念為什么需要生產消費者模型應用場景&#xff1a;C 實現生產消費者模型代碼示例代碼詳細解釋共享資源和同步機制生產者函數 producer()消費者函數 consumer()主函數 main() 注意事項總…

Spring Boot 項目開發流程全解析

目錄 引言 一、開發環境準備 二、創建項目 三、項目結構 四、開發業務邏輯 1.創建實體類&#xff1a; 2.創建數據訪問層&#xff08;DAO&#xff09;&#xff1a; 3.創建服務層&#xff08;Service&#xff09;&#xff1a; 4.創建控制器層&#xff08;Controller&…

數據結構課程設計(java實現)---九宮格游戲,也稱幻方

【問題描述】 九宮格&#xff0c;一款數字游戲&#xff0c;起源于河圖洛書&#xff0c;與洛書是中國古代流傳下來的兩幅神秘圖案&#xff0c;歷來被認為是河洛文化的濫觴&#xff0c;中華文明的源頭&#xff0c;被譽為"宇宙魔方"。九宮格游戲對人們的思維鍛煉有著極大…

GPT-4.5 怎么樣?如何升級使用ChatGPTPlus/Pro? GPT-4.5設計目標是成為一款非推理型模型的巔峰之作

GPT-4.5 怎么樣&#xff1f;如何升級使用ChatGPTPlus/Pro? GPT-4.5設計目標是成為一款非推理型模型的巔峰之作 今天我們來說說上午發布的GPT-4.5&#xff0c;接下來我們說說GPT4.5到底如何&#xff0c;有哪些功能&#xff1f;有哪些性能提升&#xff1f;怎么快速使用到GPT-4.…

【vscode-解決方案】vscode 無法登錄遠程服務器的兩種解決辦法

解決方案一&#xff1a; 查找原因 命令 ps ajx | grep vscode 可能會看到一下這堆信息&#xff08;如果沒有大概率不是這個原因導致&#xff09; 這堆信息的含義&#xff1a;當你使用 vscode 遠程登錄服務器時&#xff0c;我們遠程機器服務端要給你啟動一個叫做 vscode serv…

一、對4*3按鍵模塊編程分析

一、4*3鍵盤模塊實物分析 說明&#xff1a; 1、橫著4排&#xff0c;豎著3列&#xff0c;加起來共7組&#xff0c;所以對外引出7根線。 2、根據排針終端引腳又可分兩類。即橫排和豎列對應的引腳。 二、代碼編寫構想&#xff1a; 1、使用7個gpio輸入中斷&#xff0c;檢測7個…

自然語言處理NLP入門 -- 第十節NLP 實戰項目 2: 簡單的聊天機器人

一、為什么要做聊天機器人&#xff1f; 在互聯網時代&#xff0c;我們日常接觸到的“在線客服”“自動問答”等&#xff0c;大多是以聊天機器人的形式出現。它能幫我們快速回復常見問題&#xff0c;讓用戶獲得及時的幫助&#xff0c;并在一定程度上減少人工客服的壓力。 同時&…

linux(1)文件管理

文章目錄 文件目錄系統相對路徑絕對路徑命令解析器文件管理 文件目錄系統 bin&#xff1a; 二進制文件目錄&#xff0c;存儲可執行文件 dev&#xff1a;設備目錄&#xff0c;所有的硬件都會抽象成文件存儲&#xff0c;比如鼠標鍵盤 home&#xff1a;存儲普通用戶的家目錄 li…

CSS—選擇器詳解:5分鐘動手掌握選擇器

個人博客&#xff1a;haichenyi.com。感謝關注 1. 目錄 1–目錄2–引言3–種類4–優先級 引言 什么是選擇器&#xff1f; CSS選擇器是CSS&#xff08;層疊樣式表&#xff09;中的一種規則&#xff0c;用于指定要應用樣式的HTML元素。它們就像是指向網頁中特定元素的指針&#…

大模型微調入門(Transformers + Pytorch)

目標 輸入&#xff1a;你是誰&#xff1f; 輸出&#xff1a;我們預訓練的名字。 訓練 為了性能好下載小參數模型&#xff0c;普通機器都能運行。 下載模型 # 方式1&#xff1a;使用魔搭社區SDK 下載 # down_deepseek.py from modelscope import snapshot_download model_…

DeepSeek實戰

DeepSeek 接入實戰&#xff1a;從零開始快速上手 引言 在當今的 AI 領域&#xff0c;DeepSeek 作為一個強大的自然語言處理&#xff08;NLP&#xff09;平臺&#xff0c;提供了豐富的 API 接口&#xff0c;幫助開發者快速實現智能對話、文本生成、語義分析等功能。本文將帶你…

Android NDK打包封裝教程與優化技巧

關于NDK打包封裝的問題。首先,用戶可能不太清楚NDK的基本概念,所以我應該先解釋NDK是什么以及它的作用。然后,用戶可能想知道如何在Android項目中使用NDK,所以需要分步驟說明配置過程,包括安裝NDK、配置CMake或ndk-build,創建JNI接口,編寫C/C++代碼,編譯和打包。 接下…

【告別雙日期面板!一招實現el-date-picker智能聯動日期選擇】

告別雙日期面板&#xff01;一招實現el-date-picker智能聯動日期選擇 1.需求背景2.DateTimePicker 現狀圖3.日期選擇器實現代碼4.日期選擇器實現效果圖5.日期時間選擇器實現代碼6.日期時間選擇器實現效果圖 1.需求背景 在用戶使用時間查詢時&#xff0c;我們經常需要按月份篩選…