容器是現代程式設計非常基礎而重要的手段。
所謂容器,就是“放東西的東西”。數組可以看作是一種容器,但是數組的元素個數一旦确定就無法改變,這在實際使用中是很大的不足。一般意義上的容器,是指具有自動增長容量能力的存放資料的一種資料結構。在面向對象語言中,這種資料結構本身表達為一個對象。是以才有“放東西的東西”的說法。
Java具有豐富的容器,Java的容器具有豐富的功能和良好的性能。熟悉并能充分有效地利用好容器,是現代程式設計的基本能力。
我們首先學習的是順序容器,即放進容器中的對象是按照指定的順序(放的順序)排列起來的,而且允許具有相同值的多個對象存在。
在一些書中,将容器(英文為collection或container)翻譯為“集合”,由于數學中的集合(Set)也是一種特定的容器類型,我們認為将collection翻譯為集合是不恰當的。是以我們隻會使用容器一詞。
順序容器相關:
需求分析:如果我們想要建立一個記事本,那麼我們對這個記事本會有什麼樣的要求呢?
1:能存儲記錄
2:不限制能存儲記錄的數量
3:能知道已經存儲的記錄的數量
4:能檢視存進去的每一條記錄
5:能删除一條記錄
6:能列出所有的記錄
假設建立類NoteBook,對其進行接口設計。
接口設計:将人機互動與(輸入輸出)業務邏輯(對資料的處理)分離
1:add(String note);
2:getSize();
3:getNote(int index);
4:removeNote(int index);
5:list();
代碼實作:
importjava.util.ArrayList;public classNoteBook {//容器類
private ArrayList notes=new ArrayList();//容器類中自帶add()方法
public voidadd(String note) {
notes.add(note);
}//容器類中自帶方法,檢視記錄數量
public intgetSize() {returnnotes.size();
}//容器類中自帶方法,得到記錄内容
public String getNote(intindex) {returnnotes.get(index);
}//容器類中自帶方法,移除第index位記錄
public void removeNote(intindex) {
notes.remove(index);
}//容器類中自帶方法,将記錄的内容傳給String數組
publicString[] list() {
String[] a=newString[notes.size()];//for(int i=0;i
notes.toArray(a);returna;
}public static voidmain(String[] args) {
NoteBook nb=newNoteBook();
nb.add("First");
nb.add("Second");
System.out.println(nb.getSize());//使用ArrayList實作For-Each循環
ArrayList a=new ArrayList<>();
a.add("First");
a.add("Second");for(String s:a) {
System.out.println(s);
}
}
}
容器類:ArrayList notes=new ArrayList();
容器類有兩個類型:1:容器的類型——ArrayList
2:元素的類型——String
當數組的元素的類型是類的時候,數組的每一個元素其實隻是對象的管理者而不是對象本身。是以,僅僅建立數組并沒有建立其中的每一個對象!
int類型數組與String類型數組的差別:String建立的對象s隻是對象的管理者而不是所有者,即對象數組裡面每個元素都是對象的管理者而不是所有者。

思考題:如何設計能傳遞任意數量參數的函數?
Java中在形參之後加上 ... ,表示參數數量不固定,示例代碼如下:
public classMain {public static int sum(int... num) {int sum = 0;for(Integer integer : num) {
sum+=integer;
}returnsum;
}public static voidmain(String[] args) {//TODO Auto-generated method stub
int sum = sum(1,2,3);
System.out.println(sum);
}
}
集合容器(set)相關:
集合就是數學中的集合的概念:所有的元素都具有唯一的值,元素在其中沒有順序。
舉例:
importjava.util.HashSet;public classMain {public static voidmain(String[] args) {//TODO Auto-generated method stub
HashSet s=new HashSet();
s.add("First");
s.add("Second");
s.add("First");for(String k:s) {
System.out.println(k);
}//另外一種輸出方法
System.out.println(s);
}
}//結果://Second//First//[Second, First]//數學集合(set)的特點之一就是其中的數值具有唯一性且不排序
散清單(Hash)相關:
數字-美元對應
importjava.util.HashMap;importjava.util.Scanner;public classCoins {//在所有的容器裡面,所有的類型都必須是對象而不能是基本類型。
private HashMap coinnames=new HashMap();publicCoins() {//HaspMap裡面的put方法,Integer表示鍵位,String表示put進去的内容
coinnames.put(1, "penny");
coinnames.put(5, "niclle");
coinnames.put(10, "dime");
coinnames.put(25, "quarter");
coinnames.put(50, "half-dollar");//對哈希表而言,鍵key一定是唯一的。同一個鍵放進去多個值,最終留下的隻要最後一次的
coinnames.put(50, "五毛!");
System.out.println(coinnames.keySet().size());//結果為4
System.out.println(coinnames);//結果是:{1=penny, 50=五毛!, 5=niclle, 25=quarter, 10=dime}//Hash表的循環
for(Integer k:coinnames.keySet()) {
String s=coinnames.get(k);
System.out.println(s);
}
}//傳回String value
public String getName(intamount) {if(coinnames.containsKey(amount)) {returncoinnames.get(amount);
}else
return "NO FOUND!";
}public static voidmain(String[] args) {
Scanner in=newScanner(System.in);
Coins c=newCoins();int a=in.nextInt();
String name=c.getName(a);
System.out.println(name);
}
}
結果為:
5{1=penny, 50=五毛!, 5=niclle, 25=quarter, 10=dime}
penny
五毛!
niclle
quarter
dime
課後思考題:學生成績的資料結構
如果要寫程式表達一個班級的很多個學生的很多門課的成績,應該如何表達這些資料?
如果我們希望通過學生的姓名,可以找到他的所有的成績,而每一門課的成績,是由課程名稱和分數構成的。
而如果我們還希望這個程式能找出某一門課的全部學生的成績應該怎樣做呢?
注意,并非所有的學生都參加了所有的課程。
代碼實作:
題目内容:
下圖為國内主要城市之間的公路裡程:
你的程式要讀入這樣的一張表,然後,根據輸入的兩個城市的名稱,給出這兩個城市之間的裡程。
注意:任何兩個城市之間的裡程都已經給出,不需要計算經第三地中轉。
注意:你并不需要去錄入上圖的資料,資料是在程式輸入中給的。
輸入格式:
首先,你會讀到若幹個城市的名字。每個名字都隻是一個英文單詞,中間不含空格或其他符号。當讀到名字為“###”(三個#号)時,表示城市名字輸入結束,###并不是一個城市的名字。如果記讀到的城市名字的數量為n。
然後,你會讀到nxn的一個整數矩陣。第一行的每一個數字,表示上述城市名單中第一個城市依次到另一個城市之間的裡程。表中同一個城市之間的裡程為0。
最後,你會讀到兩個城市的名字。
輸出格式:
輸出這兩個城市之間的距離。
輸入樣例:
HagzouHugzouJigxng ###
01108708
11080994
7089940
Hagzou Jigxng
輸出樣例:
708
時間限制:500ms記憶體限制:32000kb
代碼實作:
importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Scanner;public classThirdWeenday {//建立一個順序容器,用來存儲城市的名字
private ArrayList city=new ArrayList();//建立一個散清單,裡面包含一個散清單。前者表示第i個城市,内部Hash表示第j個城市及城市之間的距離
private HashMap> distance=new HashMap>();private static Scanner in=newScanner(System.in);public voidadd() {
String s;boolean b=true;//判斷,當輸出城市以###結尾時,不再輸入
while(b) {
s=in.next();if(s.equals("###")==true) {
b=false;break;
}
city.add(s);
}//讀入距離
for(int i=0;i
HashMap HM=new HashMap();for(int j=0;j
HM.put(city.get(j), dis);
}
distance.put(city.get(i), HM);
}
}//查找兩個城市之間的距離
public intgetDistance(String start, String end){int dis = 0;
dis=distance.get(start).get(end);returndis;
}public static voidmain(String[] args) {//TODO Auto-generated method stub//Scanner in=new Scanner(System.in);
ThirdWeenday distan=newThirdWeenday();
distan.add();
String start=in.next();
String end=in.next();
System.out.println(distan.getDistance(start, end));
}
}