java 集合3
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(); } }
浙公網安備 33010602011771號