一、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.?數組的局限性:
??數組大小固定,不能動態擴展。如果需要改變數組的大小,必須創建新的數組。
??數組操作比較麻煩,尤其是需要處理元素的添加、刪除時,必須手動處理大小和位置的變動。
?