1.Map集合概述

  • Interface Map K:键的类型; V:值的类型
  • 将键映射到值的对象;不能包含重复的键;每个键可以映射到最多一个值

举例:学生的学号和姓名

创建Map集合的对象

  • 多态的方式
  • 具体的实现类HashMap
  1. package com.study_01;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class MapDemo01 {
  5. public static void main(String[] args) {
  6. // 创建集合对象
  7. Map<String,String> map = new HashMap<>();
  8. //V put (K key, V value) 将指定的值与该映射中的指定键相关联
  9. map.put("xiaoZ001","林青霞");
  10. map.put("xiaoZ002","张曼玉");
  11. map.put("xiaoZ003","王祖贤");
  12. map.put("xiaoZ003","柳岩");
  13. // 输出集合对象
  14. System.out.println(map);
  15. }
  16. }

2.Map集合的基本功能

Map - 图1

  1. package com.study_01;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class MapDemo02 {
  5. public static void main(String[] args) {
  6. // 创建集合对象
  7. Map<String,String> map = new HashMap<>();
  8. //V put (K key, V value) 将指定的值与该映射中的指定键相关联
  9. map.put("张无忌","赵敏");
  10. map.put("郭靖","黄蓉");
  11. map.put("杨过","小龙女");
  12. // 根据键删除键值对元素
  13. // System.out.println(map.remove("郭靖"));
  14. // System.out.println(map.remove("郭襄"));
  15. // 移除所有键值对元素
  16. // map.clear();
  17. // 判断集合是否包含指定的键
  18. // System.out.println(map.containsKey("郭靖"));
  19. // System.out.println(map.containsKey("郭襄"));
  20. // 判断集合是否为空
  21. // System.out.println(map.isEmpty());
  22. // 集合长度
  23. System.out.println(map.size());
  24. // 输出集合
  25. System.out.println(map);
  26. }
  27. }

3.Map集合的获取功能

Map - 图2

  1. package com.study_01;
  2. import java.util.Collection;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Set;
  6. public class MapDemo03 {
  7. public static void main(String[] args) {
  8. // 创建集合对象
  9. Map<String, String> map = new HashMap<>();
  10. // 添加元素
  11. map.put("张无忌", "赵敏");
  12. map.put("郭靖", "黄蓉");
  13. map.put("杨过", "小龙女");
  14. // 根据键获取值
  15. // System.out.println(map.get("张无忌"));
  16. // System.out.println(map.get("张三丰"));
  17. // Set<K> keySet() : 获取所有键的值
  18. // Set<String> keySet = map.keySet();
  19. // for (String i : keySet){
  20. // System.out.println(i);
  21. // }
  22. // 获取所有值的集合
  23. Collection<String> values = map.values();
  24. for (String i : values) {
  25. System.out.println(i);
  26. }
  27. }
  28. }

4.Map集合的遍历(方式1)

我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合

遍历思路

  • 把所有的丈夫给集中起来
  • 遍历丈夫的集合,获取到每一个丈夫
  • 根据丈夫去找对应的妻子

转换为Map集合中的操作:

  • 获取所有键的集合。 用keySet0方法实现
  • 遍历键的集合,获取到每一个键。用增强for实现
  • 根据键去找值。用get(Object key)方法实现
  1. package com.study_02;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. public class MapDemo01 {
  6. public static void main(String[] args) {
  7. // 创建集合对象
  8. Map<String,String> map = new HashMap<>();
  9. // t添加元素
  10. map.put("张无忌","赵敏");
  11. map.put("郭靖","黄蓉");
  12. map.put("杨过","小龙女");
  13. // 获取所有键的集合,用keySet()实现
  14. Set<String> keySet = map.keySet();
  15. // 遍历键的耳机和,获取到每一个键,用增强for实现
  16. for (String key : keySet) {
  17. String value = map.get(key);
  18. System.out.println(key+","+value);
  19. }
  20. }
  21. }

5.Map集合的遍历(方式2)

我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个妻对的集合

遍历思路

  • 获取所有结婚证的集合
  • 遍历结婚证的集合,得到每一个结婚证
  • 根据结婚证获取丈夫和妻子

转换为Map集合中的操作:

  • 获取所有键值对对象的集合
    • Set > entrySet(:获取所有键值对对象的集合
  • 遍历键值对对象的集合,得到每一个键值对对象
    • 用增强for实现,得到每一个Map.Entry
  • 根据键值对对象获取键和值
    • 用getKey()得到键
    • 用getValue()得到值 ```java package com.study_02;

import java.util.HashMap; import java.util.Map; import java.util.Set;

public class MapDemo02 { public static void main(String[] args) { // 创建集合对象 Map map = new HashMap<>();

  1. // t添加元素
  2. map.put("张无忌","赵敏");
  3. map.put("郭靖","黄蓉");
  4. map.put("杨过","小龙女");
  5. // 获取所有键值对对象的集合
  6. Set<Map.Entry<String,String>> entrySet = map.entrySet();
  7. // 遍历键值对对象的集合,得到每一个键值对对象
  8. for (Map.Entry<String,String> me : entrySet) {
  9. String key = me.getKey();
  10. String value = me.getValue();
  11. System.out.println(key+"," + value);
  12. }
  13. // 根据键值对对象获取键和值
  14. }

}

  1. <a name="7c04953f"></a>
  2. ## 6.案例
  3. 案例: HashMap集合存储学生对象并遍历
  4. 需求:创建一个HashMap集合, 键是学号(String), 值是学生对象(Student)。存储三E个键值对元素,并遍历
  5. ```java
  6. package com.study_03;
  7. import java.util.Objects;
  8. public class Student {
  9. private String name;
  10. private int age;
  11. public Student(String name, int age) {
  12. this.name = name;
  13. this.age = age;
  14. }
  15. public Student() {
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public int getAge() {
  24. return age;
  25. }
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29. @Override
  30. public String toString() {
  31. return "Student{" +
  32. "name='" + name + '\'' +
  33. ", age=" + age +
  34. '}';
  35. }
  36. }
  1. package com.study_03;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. public class HashMapDemo {
  6. public static void main(String[] args) {
  7. // 创建HashMap集合对象
  8. HashMap<String,Student> hm = new HashMap<>();
  9. // 创建学生对象
  10. Student s1 = new Student("林青霞",30);
  11. Student s2 = new Student("张曼玉",35);
  12. Student s3 = new Student("王祖贤",33);
  13. // 把学生添加到集合
  14. hm.put("stu001",s1);
  15. hm.put("stu002",s2);
  16. hm.put("stu003",s3);
  17. // 键找值
  18. Set<String> set = hm.keySet();
  19. for (String key : set) {
  20. Student value = hm.get(key);
  21. System.out.println(key+","+value);
  22. }
  23. System.out.println("---------");
  24. Set<Map.Entry<String, Student>> entrySet = hm.entrySet();
  25. for (Map.Entry<String, Student> me : entrySet) {
  26. String key = me.getKey();
  27. Student value = me.getValue();
  28. System.out.println();
  29. }
  30. }}

7.案例

需求:创建一个HashMap集合,键是学生对象(Student), 值是居住地(String)。存储多个键值对元素,并遍历。

要求保证键的唯一性: 如果学生对象的成员变量值相同,我们就认为是同一个对象

  1. package com.study_04;
  2. import java.util.Objects;
  3. public class Student {
  4. private String name;
  5. private int age;
  6. public Student(String name, int age) {
  7. this.name = name;
  8. this.age = age;
  9. }
  10. public Student() {
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getAge() {
  19. return age;
  20. }
  21. public void setAge(int age) {
  22. this.age = age;
  23. }
  24. @Override
  25. public boolean equals(Object o) {
  26. if (this == o) return true;
  27. if (o == null || getClass() != o.getClass()) return false;
  28. Student student = (Student) o;
  29. return age == student.age && Objects.equals(name, student.name);
  30. }
  31. @Override
  32. public int hashCode() {
  33. return Objects.hash(name, age);
  34. }
  35. @Override
  36. public String toString() {
  37. return "Student{" +
  38. "name='" + name + '\'' +
  39. ", age=" + age +
  40. '}';
  41. }
  42. }
  1. package com.study_04;
  2. import java.util.HashMap;
  3. import java.util.Set;
  4. public class HashMapDemo {
  5. public static void main(String[] args) {
  6. // 创建HashMap集合对象
  7. HashMap<Student,String > hm = new HashMap<>();
  8. // 创建学生对象
  9. Student s1 = new Student("林青霞",30);
  10. Student s2 = new Student("张曼玉",35);
  11. Student s3 = new Student("王祖贤",33);
  12. Student s4 = new Student("王祖贤",33);
  13. // 把学生添加到集合
  14. hm.put(s1,"西安");
  15. hm.put(s2,"武汉");
  16. hm.put(s3,"郑州");
  17. hm.put(s4,"北京");
  18. // 遍历集合
  19. Set<Student> set = hm.keySet();
  20. for (Student key : set) {
  21. String value = hm.get(key);
  22. System.out.println(key+","+value);
  23. }
  24. }
  25. }

8.集合嵌套值ArrayList嵌套HashMap

需求:创建一个ArrayList集合, 存储三个元素,每一个元素都是HashMap, 每一个HashMap的键和值都是String, 并遍历

  1. package com.study_05;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.Set;
  5. public class ArrayListCludeHashMapDemo {
  6. public static void main(String[] args) {
  7. // 创建ArrayLis集合
  8. ArrayList<HashMap<String, String>> array = new ArrayList<>();
  9. // 创建HashMap集合
  10. HashMap<String, String> hm1 = new HashMap<>();
  11. hm1.put("孙策", "大桥");
  12. hm1.put("周瑜", "小乔");
  13. array.add(hm1);
  14. HashMap<String, String> hm2 = new HashMap<>();
  15. hm2.put("郭靖", "黄蓉");
  16. hm2.put("杨过", "小龙女");
  17. array.add(hm2);
  18. HashMap<String, String> hm3 = new HashMap<>();
  19. hm3.put("孙策3", "大桥3");
  20. hm3.put("周瑜3", "小乔3");
  21. array.add(hm3);
  22. for (HashMap<String,String> hm : array) {
  23. Set<String> keySetset = hm.keySet();
  24. for (String key : keySetset) {
  25. String value = hm.get(key);
  26. System.out.println(key + "," + value);
  27. }
  28. }
  29. }
  30. }

9.HashMap集合存储ArrayList集合并遍历

需求:创建一个HashMap集合,存储三个键值对元素,每一个键值对元素的键是String,值是ArrayList,每一个ArrayList的元素是String,并遍历

  1. package com.study_05;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.Set;
  5. public class HashMapDemo {
  6. public static void main(String[] args) {
  7. // 创建HashMap集合
  8. HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>();
  9. // 创建ArrayLis集合,并添加元素
  10. ArrayList<String> sgyy = new ArrayList<>();
  11. sgyy.add("诸葛亮");
  12. sgyy.add("赵云");
  13. // 把ArrayList作为元素添加到Has和Map集合
  14. hm.put("三国演义", sgyy);
  15. ArrayList<String> xyj = new ArrayList<>();
  16. xyj.add("唐僧");
  17. xyj.add("孙悟空");
  18. // 把ArrayList作为元素添加到Has和Map集合
  19. hm.put("西游记", xyj);
  20. ArrayList<String> shz = new ArrayList<>();
  21. shz.add("武松");
  22. shz.add("鲁智深");
  23. // 把ArrayList作为元素添加到Has和Map集合
  24. hm.put("水浒传", shz);
  25. // 遍历HashMap
  26. Set<String> keySet = hm.keySet();
  27. for (String key : keySet) {
  28. System.out.println(key);
  29. ArrayList<String> value = hm.get(key);
  30. for (String s : value) {
  31. System.out.println("\t"+s);
  32. }
  33. }
  34. }
  35. }

10.案例:统计字符串中每个字符出现的次数

需求:键盘录入一个字符串,要求统计字符串中每个字符串出现的次数。
举例:键盘录入“aababcabcdabcde”在控制台输出:“a(5)b(4)c(3)d(2)e(1)”

  1. package com.study_06;
  2. import java.util.HashMap;
  3. import java.util.Scanner;
  4. import java.util.Set;
  5. import java.util.TreeMap;
  6. public class HashMapDemo {
  7. public static void main(String[] args) {
  8. // 键盘录入数据
  9. Scanner sc = new Scanner(System.in);
  10. System.out.print("请输入一个字符串:");
  11. String line = sc.nextLine();
  12. // 创建HashMap集合,键是Character,值是Integer
  13. // HashMap<Character, Integer> hm = new HashMap<>();
  14. TreeMap<Character, Integer> hm = new TreeMap<>(); // 按键自然排序
  15. // 遍历字符串
  16. for (int i = 0; i < line.length(); i++) {
  17. char key = line.charAt(i);
  18. Integer value = hm.get(key);
  19. if (value == null) {
  20. // /如果返回值是nulL:说明该字符在HashMap集合中不存在,就把该字符作为键,1作为值存储
  21. hm.put(key, 1);
  22. } else {
  23. // /如果返回值不是nulL:说明该字符在HashMap集合中存在,把该值加1,然后重新存储该事符和对应的值
  24. hm.put(key, value + 1);
  25. }
  26. }
  27. //遍历HashMap集合,得到键和值,按照要求进行拼接
  28. StringBuilder sb = new StringBuilder();
  29. Set<Character> keySet = hm.keySet();
  30. for (Character key : keySet) {
  31. Integer value = hm.get(key);
  32. sb.append(key).append("(").append(value).append(")");
  33. }
  34. String result = sb.toString();
  35. System.out.println(result);
  36. }
  37. }

11.Collections概述和使用

Collections类的概述

  • 是针对集合操作的工具类

Collections类的常用方法

  • public static> void sort(List< T > list):将指定的列表按升序排序
  • public static void reverse(List< ?>list):反转指定列表中元素的顺序e
  • public static void shuffle(List< ?>list):使用默认的随机源随机排列指定的列表
  1. package com.study_01;
  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import java.util.Collections;
  5. import java.util.List;
  6. public class CollectionDemo01 {
  7. public static void main(String[] args) {
  8. // 创建集合对象
  9. List<Integer> list = new ArrayList<>();
  10. //添加元素
  11. list.add(30);
  12. list.add(50);
  13. list.add(20);
  14. list.add(100);
  15. // public static<T extends Comparable<?super T>> void sort(List< T > list):将指定的列表按升序排序
  16. // Collections.sort(list);
  17. // Collections.reverse(list);
  18. Collections.shuffle(list);
  19. System.out.println(list);
  20. }
  21. }
  1. package com.study_01;
  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import java.util.Collections;
  5. import java.util.Comparator;
  6. public class CollectionDemo02 {
  7. public static void main(String[] args) {
  8. // 创建ArrayList集合对象
  9. ArrayList<Student> array = new ArrayList<>();
  10. // 创建学生对象
  11. Student s1 = new Student("lin",30);
  12. Student s2 = new Student("zhang",35);
  13. Student s3 = new Student("wang",33);
  14. Student s4 = new Student("liu",33);
  15. // 把学生添加到集合
  16. array.add(s1);
  17. array.add(s2);
  18. array.add(s3);
  19. array.add(s4);
  20. //sort (List<T> list,Comparator<? super T>c)
  21. Collections.sort(array, new Comparator<Student>() {
  22. @Override
  23. public int compare(Student s1, Student s2) {
  24. int num = s1.getAge() - s2.getAge();
  25. int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
  26. return num2;
  27. }
  28. });
  29. for (Student s : array) {
  30. System.out.println(s);
  31. }
  32. }
  33. }
  1. package com.study_01;
  2. public class Student {
  3. private String name;
  4. private int age;
  5. public Student(String name, int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. public Student() {
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. @Override
  24. public String toString() {
  25. return "Student{" +
  26. "name='" + name + '\'' +
  27. ", age=" + age +
  28. '}';
  29. }
  30. }

12.ArrayList学生案例并排序

  1. Collections.sort(array, new Comparator<Student>() {
  2. @Override
  3. public int compare(Student s1, Student s2) {
  4. int num = s1.getAge() - s2.getAge();
  5. int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
  6. return num2;
  7. }
  8. });

13.模拟斗地主

需求:通过程序实现斗地主过程中的洗牌,发牌和看牌

  1. package com.study_02;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. public class PokerDemo {
  5. public static void main(String[] args) {
  6. // 创建牌盒
  7. ArrayList<String> array = new ArrayList<>();
  8. // 网牌盒里面装牌
  9. // 定义花色数组
  10. String[] colors = {"♦", "♣", "♠", "♥"};
  11. // 定义点数数组
  12. String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
  13. for (String color : colors) {
  14. for (String number : numbers) {
  15. array.add(color + number);
  16. }
  17. }
  18. array.add("大王");
  19. array.add("小王");
  20. // 洗牌
  21. Collections.shuffle(array);
  22. // 发牌
  23. ArrayList<String> lqxArray = new ArrayList<>();
  24. ArrayList<String> lyArray = new ArrayList<>();
  25. ArrayList<String> fqyArray = new ArrayList<>();
  26. ArrayList<String> dpArray = new ArrayList<>(); // 底牌三张
  27. for (int i = 0; i < array.size(); i++) {
  28. String poker = array.get(i);
  29. if (i >= array.size() - 3) {
  30. dpArray.add(poker);
  31. } else if (i % 3 == 0) {
  32. lqxArray.add(poker);
  33. }else if (i % 3 == 1) {
  34. lyArray.add(poker);
  35. }else if (i % 3 == 2) {
  36. fqyArray.add(poker);
  37. }
  38. }
  39. lookPooker("林青霞",lqxArray);
  40. lookPooker("柳岩",lyArray);
  41. lookPooker("风情杨",fqyArray);
  42. lookPooker("底牌",dpArray);
  43. }
  44. // 看牌的方法
  45. public static void lookPooker(String name,ArrayList<String> array) {
  46. System.out.println(name + "的牌是:");
  47. for (String poker : array) {
  48. System.out.print(poker+" ");
  49. }
  50. System.out.println();
  51. }
  52. }

14.案例:模拟斗地主升级版

需求:通过程序实现斗地主过程中的洗牌,发牌和看牌。要求:对牌进行排序

  1. package com.study_03;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.HashMap;
  5. import java.util.TreeSet;
  6. public class PokerDemo {
  7. public static void main(String[] args) {
  8. // 创建hashmap集合,键是编号,值是牌
  9. HashMap<Integer, String> hm = new HashMap<>();
  10. // 存储编号
  11. ArrayList<Integer> array = new ArrayList<>();
  12. // 创建花色数组和点数组
  13. // 定义花色数组
  14. String[] colors = {"♦", "♣", "♠", "♥"};
  15. // 定义点数数组
  16. String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
  17. int index = 0;
  18. for (String number : numbers) {
  19. for (String color : colors) {
  20. hm.put(index, color + number);
  21. array.add(index);
  22. index++;
  23. }
  24. }
  25. hm.put(index, "小王");
  26. array.add(index);
  27. index++;
  28. hm.put(index, "大王");
  29. array.add(index);
  30. // 洗牌(洗的是编号),用Collection的shuffle()方法实现
  31. Collections.shuffle(array);
  32. // 发牌
  33. TreeSet<Integer> lqxSet = new TreeSet<>();
  34. TreeSet<Integer> lyxSet = new TreeSet<>();
  35. TreeSet<Integer> fqySet = new TreeSet<>();
  36. TreeSet<Integer> dpSet = new TreeSet<>();
  37. for (int i = 0; i < array.size(); i++) {
  38. int x = array.get(i);
  39. if (i >= array.size() - 3) {
  40. dpSet.add(x);
  41. } else if (i % 3 == 0) {
  42. lqxSet.add(x);
  43. }else if (i % 3 == 1) {
  44. lyxSet.add(x);
  45. }else if (i % 3 == 2) {
  46. fqySet.add(x);
  47. }
  48. }
  49. lookPoker("林青霞",lqxSet,hm);
  50. lookPoker("柳岩",lyxSet,hm);
  51. lookPoker("风情杨",fqySet,hm);
  52. lookPoker("底牌",dpSet,hm);
  53. }
  54. // 定义方法看牌
  55. public static void lookPoker(String name, TreeSet<Integer> ts,HashMap<Integer,String> hm) {
  56. System.out.println(name + "的牌是:");
  57. for (Integer key : ts) {
  58. String poker = hm.get(key);
  59. System.out.print(poker+" ");
  60. }
  61. System.out.println();
  62. }
  63. }