Map集合&Collections集合工具類
阿新 • • 發佈:2022-04-12
1.Map集合
1.1Map集合概述和特點【理解】
-
Map集合概述
interface Map<K,V> K:鍵的型別;V:值的型別
-
Map集合的特點
- 鍵值對對映關係
- 一個鍵對應一個值
- 鍵不能重複,值可以重複
- 元素存取無序
-
Map集合的基本使用
public class MapDemo01 { public static void main(String[] args) { //建立集合物件 Map<String,String> map = new HashMap<String,String>(); //V put(K key, V value) 將指定的值與該對映中的指定鍵相關聯 map.put("itheima001","林青霞"); map.put("itheima002","張曼玉"); map.put("itheima003","王祖賢"); map.put("itheima003","柳巖"); //輸出集合物件 System.out.println(map); } }
1.2Map集合的基本功能【應用】
-
方法介紹
方法名 說明 V put(K key,V value) 新增元素 V remove(Object key) 根據鍵刪除鍵值對元素 void clear() 移除所有的鍵值對元素 boolean containsKey(Object key) 判斷集合是否包含指定的鍵 boolean containsValue(Object value) 判斷集合是否包含指定的值 boolean isEmpty() 判斷集合是否為空 int size() 集合的長度,也就是集合中鍵值對的個數 -
示例程式碼
public class MapDemo02 { public static void main(String[] args) { //建立集合物件 Map<String,String> map = new HashMap<String,String>(); //V put(K key,V value):新增元素 map.put("張無忌","趙敏"); map.put("郭靖","黃蓉"); map.put("楊過","小龍女"); //V remove(Object key):根據鍵刪除鍵值對元素 // System.out.println(map.remove("郭靖")); // System.out.println(map.remove("郭襄")); //void clear():移除所有的鍵值對元素 // map.clear(); //boolean containsKey(Object key):判斷集合是否包含指定的鍵 // System.out.println(map.containsKey("郭靖")); // System.out.println(map.containsKey("郭襄")); //boolean isEmpty():判斷集合是否為空 // System.out.println(map.isEmpty()); //int size():集合的長度,也就是集合中鍵值對的個數 System.out.println(map.size()); //輸出集合物件 System.out.println(map); } }
1.3Map集合的獲取功能【應用】
-
方法介紹
方法名 說明 V get(Object key) 根據鍵獲取值 Set keySet() 獲取所有鍵的集合 Collection values() 獲取所有值的集合 Set<Map.Entry<K,V>> entrySet() 獲取所有鍵值對物件的集合 -
示例程式碼
public class MapDemo03 { public static void main(String[] args) { //建立集合物件 Map<String, String> map = new HashMap<String, String>(); //新增元素 map.put("張無忌", "趙敏"); map.put("郭靖", "黃蓉"); map.put("楊過", "小龍女"); //V get(Object key):根據鍵獲取值 // System.out.println(map.get("張無忌")); // System.out.println(map.get("張三丰")); //Set<K> keySet():獲取所有鍵的集合 // Set<String> keySet = map.keySet(); // for(String key : keySet) { // System.out.println(key); // } //Collection<V> values():獲取所有值的集合 Collection<String> values = map.values(); for(String value : values) { System.out.println(value); } } }
1.4Map集合的遍歷(方式1)【應用】
-
遍歷思路
- 我們剛才儲存的元素都是成對出現的,所以我們把Map看成是一個夫妻對的集合
- 把所有的丈夫給集中起來
- 遍歷丈夫的集合,獲取到每一個丈夫
- 根據丈夫去找對應的妻子
- 我們剛才儲存的元素都是成對出現的,所以我們把Map看成是一個夫妻對的集合
-
步驟分析
- 獲取所有鍵的集合。用keySet()方法實現
- 遍歷鍵的集合,獲取到每一個鍵。用增強for實現
- 根據鍵去找值。用get(Object key)方法實現
-
程式碼實現
public class MapDemo01 { public static void main(String[] args) { //建立集合物件 Map<String, String> map = new HashMap<String, String>(); //新增元素 map.put("張無忌", "趙敏"); map.put("郭靖", "黃蓉"); map.put("楊過", "小龍女"); //獲取所有鍵的集合。用keySet()方法實現 Set<String> keySet = map.keySet(); //遍歷鍵的集合,獲取到每一個鍵。用增強for實現 for (String key : keySet) { //根據鍵去找值。用get(Object key)方法實現 String value = map.get(key); System.out.println(key + "," + value); } } }
1.5Map集合的遍歷(方式2)【應用】
-
遍歷思路
- 我們剛才儲存的元素都是成對出現的,所以我們把Map看成是一個夫妻對的集合
- 獲取所有結婚證的集合
- 遍歷結婚證的集合,得到每一個結婚證
- 根據結婚證獲取丈夫和妻子
- 我們剛才儲存的元素都是成對出現的,所以我們把Map看成是一個夫妻對的集合
-
步驟分析
- 獲取所有鍵值對物件的集合
- Set<Map.Entry<K,V>> entrySet():獲取所有鍵值對物件的集合
- 遍歷鍵值對物件的集合,得到每一個鍵值對物件
- 用增強for實現,得到每一個Map.Entry
- 根據鍵值對物件獲取鍵和值
- 用getKey()得到鍵
- 用getValue()得到值
- 獲取所有鍵值對物件的集合
-
程式碼實現
public class MapDemo02 { public static void main(String[] args) { //建立集合物件 Map<String, String> map = new HashMap<String, String>(); //新增元素 map.put("張無忌", "趙敏"); map.put("郭靖", "黃蓉"); map.put("楊過", "小龍女"); //獲取所有鍵值對物件的集合 Set<Map.Entry<String, String>> entrySet = map.entrySet(); //遍歷鍵值對物件的集合,得到每一個鍵值對物件 for (Map.Entry<String, String> me : entrySet) { //根據鍵值對物件獲取鍵和值 String key = me.getKey(); String value = me.getValue(); System.out.println(key + "," + value); } } }
1.6Map集合的案例【應用】
1.6.1HashMap集合練習之鍵是String值是Student
-
案例需求
建立一個HashMap集合,鍵是學號(String),值是學生物件(Student)。儲存三個鍵值對元素,並遍歷
-
程式碼實現
-
學生類
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
-
測試類
/* 需求: 建立一個HashMap集合,鍵是學號(String),值是學生物件(Student)。儲存三個鍵值對元素,並遍歷 思路: 1:定義學生類 2:建立HashMap集合物件 3:建立學生物件 4:把學生新增到集合 5:遍歷集合 方式1:鍵找值 方式2:鍵值對物件找鍵和值 */ public class HashMapDemo { public static void main(String[] args) { //建立HashMap集合物件 HashMap<String, Student> hm = new HashMap<String, Student>(); //建立學生物件 Student s1 = new Student("林青霞", 30); Student s2 = new Student("張曼玉", 35); Student s3 = new Student("王祖賢", 33); //把學生新增到集合 hm.put("itheima001", s1); hm.put("itheima002", s2); hm.put("itheima003", s3); //方式1:鍵找值 Set<String> keySet = hm.keySet(); for (String key : keySet) { Student value = hm.get(key); System.out.println(key + "," + value.getName() + "," + value.getAge()); } System.out.println("--------"); //方式2:鍵值對物件找鍵和值 Set<Map.Entry<String, Student>> entrySet = hm.entrySet(); for (Map.Entry<String, Student> me : entrySet) { String key = me.getKey(); Student value = me.getValue(); System.out.println(key + "," + value.getName() + "," + value.getAge()); } } }
-
1.6.2HashMap集合練習之鍵是Student值是String
-
案例需求
- 建立一個HashMap集合,鍵是學生物件(Student),值是居住地 (String)。儲存多個元素,並遍歷。
- 要求保證鍵的唯一性:如果學生物件的成員變數值相同,我們就認為是同一個物件
-
程式碼實現
-
學生類
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (age != student.age) return false; return name != null ? name.equals(student.name) : student.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } }
-
測試類
public class HashMapDemo { public static void main(String[] args) { //建立HashMap集合物件 HashMap<Student, String> hm = new HashMap<Student, String>(); //建立學生物件 Student s1 = new Student("林青霞", 30); Student s2 = new Student("張曼玉", 35); Student s3 = new Student("王祖賢", 33); Student s4 = new Student("王祖賢", 33); //把學生新增到集合 hm.put(s1, "西安"); hm.put(s2, "武漢"); hm.put(s3, "鄭州"); hm.put(s4, "北京"); //遍歷集合 Set<Student> keySet = hm.keySet(); for (Student key : keySet) { String value = hm.get(key); System.out.println(key.getName() + "," + key.getAge() + "," + value); } } }
-
1.6.3集合巢狀之ArrayList巢狀HashMap
-
案例需求
- 建立一個ArrayList集合,儲存三個元素,每一個元素都是HashMap
- 每一個HashMap的鍵和值都是String,並遍歷。
-
程式碼實現
public class ArrayListIncludeHashMapDemo { public static void main(String[] args) { //建立ArrayList集合 ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String, String>>(); //建立HashMap集合,並新增鍵值對元素 HashMap<String, String> hm1 = new HashMap<String, String>(); hm1.put("孫策", "大喬"); hm1.put("周瑜", "小喬"); //把HashMap作為元素新增到ArrayList集合 array.add(hm1); HashMap<String, String> hm2 = new HashMap<String, String>(); hm2.put("郭靖", "黃蓉"); hm2.put("楊過", "小龍女"); //把HashMap作為元素新增到ArrayList集合 array.add(hm2); HashMap<String, String> hm3 = new HashMap<String, String>(); hm3.put("令狐沖", "任盈盈"); hm3.put("林平之", "嶽靈珊"); //把HashMap作為元素新增到ArrayList集合 array.add(hm3); //遍歷ArrayList集合 for (HashMap<String, String> hm : array) { Set<String> keySet = hm.keySet(); for (String key : keySet) { String value = hm.get(key); System.out.println(key + "," + value); } } } }
1.6.4集合巢狀之HashMap巢狀ArrayList
-
案例需求
- 建立一個HashMap集合,儲存三個鍵值對元素,每一個鍵值對元素的鍵是String,值是ArrayList
- 每一個ArrayList的元素是String,並遍歷。
-
程式碼實現
public class HashMapIncludeArrayListDemo { public static void main(String[] args) { //建立HashMap集合 HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>(); //建立ArrayList集合,並新增元素 ArrayList<String> sgyy = new ArrayList<String>(); sgyy.add("諸葛亮"); sgyy.add("趙雲"); //把ArrayList作為元素新增到HashMap集合 hm.put("三國演義",sgyy); ArrayList<String> xyj = new ArrayList<String>(); xyj.add("唐僧"); xyj.add("孫悟空"); //把ArrayList作為元素新增到HashMap集合 hm.put("西遊記",xyj); ArrayList<String> shz = new ArrayList<String>(); shz.add("武松"); shz.add("魯智深"); //把ArrayList作為元素新增到HashMap集合 hm.put("水滸傳",shz); //遍歷HashMap集合 Set<String> keySet = hm.keySet(); for(String key : keySet) { System.out.println(key); ArrayList<String> value = hm.get(key); for(String s : value) { System.out.println("\t" + s); } } } }
1.6.5統計字串中每個字元出現的次數
-
案例需求
- 鍵盤錄入一個字串,要求統計字串中每個字串出現的次數。
- 舉例:鍵盤錄入“aababcabcdabcde” 在控制檯輸出:“a(5)b(4)c(3)d(2)e(1)”
-
程式碼實現
public class HashMapDemo { public static void main(String[] args) { //鍵盤錄入一個字串 Scanner sc = new Scanner(System.in); System.out.println("請輸入一個字串:"); String line = sc.nextLine(); //建立HashMap集合,鍵是Character,值是Integer // HashMap<Character, Integer> hm = new HashMap<Character, Integer>(); TreeMap<Character, Integer> hm = new TreeMap<Character, Integer>(); //遍歷字串,得到每一個字元 for (int i = 0; i < line.length(); i++) { char key = line.charAt(i); //拿得到的每一個字元作為鍵到HashMap集合中去找對應的值,看其返回值 Integer value = hm.get(key); if (value == null) { //如果返回值是null:說明該字元在HashMap集合中不存在,就把該字元作為鍵,1作為值儲存 hm.put(key,1); } else { //如果返回值不是null:說明該字元在HashMap集合中存在,把該值加1,然後重新儲存該字元和對應的值 value++; hm.put(key,value); } } //遍歷HashMap集合,得到鍵和值,按照要求進行拼接 StringBuilder sb = new StringBuilder(); Set<Character> keySet = hm.keySet(); for(Character key : keySet) { Integer value = hm.get(key); sb.append(key).append("(").append(value).append(")"); } String result = sb.toString(); //輸出結果 System.out.println(result); } }
2.Collections集合工具類
2.1Collections概述和使用【應用】
-
Collections類的作用
是針對集合操作的工具類
-
Collections類常用方法
方法名 說明 public static void sort(List list) 將指定的列表按升序排序 public static void reverse(List<?> list) 反轉指定列表中元素的順序 public static void shuffle(List<?> list) 使用預設的隨機源隨機排列指定的列表 -
示例程式碼
public class CollectionsDemo01 { public static void main(String[] args) { //建立集合物件 List<Integer> list = new ArrayList<Integer>(); //新增元素 list.add(30); list.add(20); list.add(50); list.add(10); list.add(40); //public static <T extends Comparable<? super T>> void sort(List<T> list):將指定的列表按升序排序 // Collections.sort(list); //public static void reverse(List<?> list):反轉指定列表中元素的順序 // Collections.reverse(list); //public static void shuffle(List<?> list):使用預設的隨機源隨機排列指定的列表 Collections.shuffle(list); System.out.println(list); } }
2.2ArrayList集合儲存學生並排序【應用】
-
案例需求
- ArrayList儲存學生物件,使用Collections對ArrayList進行排序
- 要求:按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序
-
程式碼實現
-
學生類
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
-
測試類
public class CollectionsDemo02 { public static void main(String[] args) { //建立ArrayList集合物件 ArrayList<Student> array = new ArrayList<Student>(); //建立學生物件 Student s1 = new Student("linqingxia", 30); Student s2 = new Student("zhangmanyu", 35); Student s3 = new Student("wangzuxian", 33); Student s4 = new Student("liuyan", 33); //把學生新增到集合 array.add(s1); array.add(s2); array.add(s3); array.add(s4); //使用Collections對ArrayList集合排序 //sort(List<T> list, Comparator<? super T> c) Collections.sort(array, new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { //按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序 int num = s1.getAge() - s2.getAge(); int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; return num2; } }); //遍歷集合 for (Student s : array) { System.out.println(s.getName() + "," + s.getAge()); } } }
-
3.鬥地主案例
3.1模擬鬥地主案例-普通版本【應用】
-
案例需求
通過程式實現鬥地主過程中的洗牌,發牌和看牌
-
程式碼實現
public class PokerDemo { public static void main(String[] args) { //建立一個牌盒,也就是定義一個集合物件,用ArrayList集合實現 ArrayList<String> array = new ArrayList<String>(); //往牌盒裡面裝牌 /* ♦2,♦3,♦4...♦K,♦A ♣2,... ♥2,... ♠2,... 小王,大王 */ //定義花色陣列 String[] colors = {"♦", "♣", "♥", "♠"}; //定義點數陣列 String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"}; for (String color : colors) { for (String number : numbers) { array.add(color + number); } } array.add("小王"); array.add("大王"); //洗牌,也就是把牌打撒,用Collections的shuffle()方法實現 Collections.shuffle(array); // System.out.println(array); //發牌,也就是遍歷集合,給三個玩家發牌 ArrayList<String> lqxArray = new ArrayList<String>(); ArrayList<String> lyArray = new ArrayList<String>(); ArrayList<String> fqyArray = new ArrayList<String>(); ArrayList<String> dpArray = new ArrayList<String>(); for (int i = 0; i < array.size(); i++) { String poker = array.get(i); if (i >= array.size() - 3) { dpArray.add(poker); } else if (i % 3 == 0) { lqxArray.add(poker); } else if (i % 3 == 1) { lyArray.add(poker); } else if (i % 3 == 2) { fqyArray.add(poker); } } //看牌,也就是三個玩家分別遍歷自己的牌 lookPoker("林青霞", lqxArray); lookPoker("柳巖", lyArray); lookPoker("風清揚", fqyArray); lookPoker("底牌", dpArray); } //看牌的方法 public static void lookPoker(String name, ArrayList<String> array) { System.out.print(name + "的牌是:"); for (String poker : array) { System.out.print(poker + " "); } System.out.println(); } }
3.2模擬鬥地主案例-升級版本【應用】
-
案例需求
通過程式實現鬥地主過程中的洗牌,發牌和看牌。要求:對牌進行排序
-
程式碼實現
public class PokerDemo { public static void main(String[] args) { //建立HashMap,鍵是編號,值是牌 HashMap<Integer, String> hm = new HashMap<Integer, String>(); //建立ArrayList,儲存編號 ArrayList<Integer> array = new ArrayList<Integer>(); //建立花色陣列和點數陣列 String[] colors = {"♦", "♣", "♥", "♠"}; String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; //從0開始往HashMap裡面儲存編號,並存儲對應的牌。同時往ArrayList裡面儲存編號 int index = 0; for (String number : numbers) { for (String color : colors) { hm.put(index, color + number); array.add(index); index++; } } hm.put(index, "小王"); array.add(index); index++; hm.put(index, "大王"); array.add(index); //洗牌(洗的是編號),用Collections的shuffle()方法實現 Collections.shuffle(array); //發牌(發的也是編號,為了保證編號是排序的,建立TreeSet集合接收) TreeSet<Integer> lqxSet = new TreeSet<Integer>(); TreeSet<Integer> lySet = new TreeSet<Integer>(); TreeSet<Integer> fqySet = new TreeSet<Integer>(); TreeSet<Integer> dpSet = new TreeSet<Integer>(); for (int i = 0; i < array.size(); i++) { int x = array.get(i); if (i >= array.size() - 3) { dpSet.add(x); } else if (i % 3 == 0) { lqxSet.add(x); } else if (i % 3 == 1) { lySet.add(x); } else if (i % 3 == 2) { fqySet.add(x); } } //呼叫看牌方法 lookPoker("林青霞", lqxSet, hm); lookPoker("柳巖", lySet, hm); lookPoker("風清揚", fqySet, hm); lookPoker("底牌", dpSet, hm); } //定義方法看牌(遍歷TreeSet集合,獲取編號,到HashMap集合找對應的牌) public static void lookPoker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) { System.out.print(name + "的牌是:"); for (Integer key : ts) { String poker = hm.get(key); System.out.print(poker + " "); } System.out.println(); } }