# Collectoin(集合)
## 目的:可透過集合,存放大量資料,並且是彈性的(不像陣列需要宣告大小),並且可以達到存放 key value或是存放資料不能有重複等需求
第一類介面Collectoin 分為2種:List、Set,而第二類介面為Map。
### List
依加入順序排列存放物件,語法如下
List <類別型態>list= new ArrayList();
類別型態必須是「物件」形式:String、Integer、Character.....
#### 可使用的方法
1. add(obj);//新增物件
2. get(index);//取出物件
3. remove(obj);移除物件
4. indexof(obj);取得物件順序
5. set(index,obj); 設定物件順序
6. size();取得物件總數
7. 若要取得List中所有的東西,可使用 iterator();方法來訪問所有元素
hasNext():若有下一個物件,就回傳true
it.next():游標往下移,回傳游標指向的物件
```
List <Integer>list= new ArrayList();
list.add(3);
list.add(6);
list.add(8);
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {//如果有下一個物件,回傳true
System.out.println(it.next());
}
```
也可用foreach 進行取值
```
for (Integer integer : list) {
System.out.println(integer);
}
```
### 補充: 可透過 Arrays.asList 將物件放到list中
List<類別型態> list = Arrays.asList(物件1,物件2,...);// 把物件放進list
### Set
Set 不能存放重複的元素,並且Set是無法依照加入順序排放,語法如下
Set <類別型態>set= new HashSet();
類別型態必須是「物件」形式:String、Integer、Character.....
Set分為HashSet、LinkedHashSet、TreeSet三種子類別
#### HashSet
Set 不能存放重複的元素,並且Set是無法依照加入順序排放,語法如下
Set <類別型態>set= new HashSet();
類別型態必須是「物件」形式:String、Integer、Character.....
#### 可使用的方法
因使用的是collect,所以List的方法可以用。
另外,contains(obj);//可確認此物件是否存在set中
#### LinkedHashSet
若希望可以不儲存重複資訊,並且進行儲存的順序進行排序,必須使用LinkedHashSet子類別
Set <類別型態>set= new LinkedHashSet();
```
public class SelfTest {
public static void main(String[] args) {
Set <Integer>set =new LinkedHashSet();
set.add(2);
set.add(4);
set.add(3);
set.add(1);
for (Integer integer : set) {
System.out.println(integer);
//會印出2431
}
}
}
```
#### TreeSet
自然排序的實作,也可指定排序方式(大>小或小>大)
public class SelfTest {
public static void main(String[] args) {
Set <Integer>set =new TreeSet<Integer>();
set.add(2);
set.add(4);
set.add(3);
set.add(1);
for (Integer integer : set) {
System.out.println(integer);
//會印出1234
}
}
}
若需要自訂排序,可以新建一個類別去實作 Comparator
```
public class TestTreeSet {
public static void main(String[] args) {
Set<Integer> set = new TreeSet<>(new Comparator<Integer>() {
//把class 寫在裡面,可以不用另外創一個class
//Anonymous class的應用一種
@Override
public int compare(Integer o1, Integer o2) {
//由大到小,o1>o2 return -1
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
if ( i1 > i2) {
return -1;
}else {
return 1;
}
}
});
set.add(4);//Integer
set.add(3);
set.add(2);
set.add(1);
for( Integer item : set ) {
System.out.println(item);
}
}
}
//最終印出 4321
```
### Map
必須存放Key,Value
#### HashMap
不會依照存入順序進行排序,語法如下:
Map<String,Integer> map =new HashMap();
可使用的方法:
1. put(key,value);//存入
2. get(obj);//取值
3. keySet();//將所有key包裝成一個Set集合,因此就可以用上面的set方法進行forrech拜訪所有元素
```
Set<String> keySet = map.keySet();
for (Object key : keySet) {
System.out.println(key +"="+map.get(key));
}
```
4. map.entrySet();//將每一組key與value包為一個Set,並把他設為Entry類別,語法如下:
Set<Entry<String, Integer>> entrySet = map.entrySet();//Entry 裡面有2種型態,<String, Integer>
#### LinkedHashMap
會按照加入時順序進行排序,語法如下:
Map<String,Integer> map =new LinkedHashMap();
#### TreeMap:可以照自己想要的順序排列
```
public static void main(String[] args) {
Map<String,Integer> map =new TreeMap<String, Integer>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()>o2.length()?1:-1;
}
});
map.put("Bass", 2000);
map.put("Vincent", 1000);
map.put("David", 5000);
Set<Entry<String, Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> entry : entrySet) {
System.out.println(entry.getKey()+","+entry.getValue());
}
}
}
//最後印出結果
//Bass,2000
//David,5000
//Vincent,1000
```