# 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 ```