---
# System prepended metadata

title: Collectoin(集合)

---

# 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

```