• Java---Map双列集合


    目录

    一、双列集合的介绍

    二、Map的使用

    1:Map中常见的API

    (1)put方法

    (2)remove方法

    2:Map的遍历

    (1)通过键找值的方式遍历

     (2)通过键值对对象遍历

     (3)Lambda表达式遍历

     三、双列集合的使用

    1:HashMap

     2:LinkedHashMap

    3:TreeMap

    (1)Comparable接口排序

     (2)Comparator比较器排序


    一、双列集合的介绍

    不同于单列集合,双列集合顾名思义是有两个元素的,说是元素,又有点不大准确。就有有一对键值对,就是有一个标志的值和这个标志的值所对应的值。也就是在算法中我们常说的标志数组吧。它和单列集合一样都是储存数据的容器

    HashMap:无序,不重复,无索引

    LinkedHashMap:有序,不重复,无索引

    TreeMap:

    综上所述Map是不重复的,但是这里的不重复是键不能重复,但是值是可以重复的。

    二、Map的使用

    1:Map中常见的API

    1. V put(k key,V value) 添加元素
    2. V remove(Object key) 根据键删除所对应的元素
    3. void clear() 清空所有的键值对元素
    4. boolean containsKey(Object key) 判断集合是否包含指定的键
    5. boolean containsValue(Object value) 判断集合是否包含指定的值
    6. boolean isEmpty() 判断集合是否为空
    7. int size() 集合的长度也就是集合中的键值对个数

    这里对于一些细节的方法我会详细说说,其他没说的方法就按照类型操作即可。

    (1)put方法

    对于put方法的返回值,如果添加的数据的键再Map容器中以及存在了,那么新添加的数据就会覆盖,而返回值就是被覆盖的键所对应的值。如果并没有覆盖,返回值就是null。

    1. package article;
    2. import java.util.Arrays;
    3. import java.lang.reflect.Array;
    4. import java.util.*;
    5. public class so {
    6. public static void main(String[] args) {
    7. Map s=new HashMap<>();
    8. String v1=s.put("jkjk", "123");
    9. System.out.println(v1);
    10. s.put("opo", "234");
    11. s.put("yyyy", "");
    12. String v2=s.put("opo", "[[[[");
    13. System.out.println(v2);
    14. System.out.println(s);
    15. }
    16. }

    (2)remove方法

    remove方法删除,其中接受的参数是你想要删除的所对应的键,同时它也会有返回值,返回值就是你所删除的对应的值。

    1. package article;
    2. import java.util.Arrays;
    3. import java.lang.reflect.Array;
    4. import java.util.*;
    5. public class so {
    6. public static void main(String[] args) {
    7. Map s=new HashMap<>();
    8. String v1=s.put("jkjk", "123");
    9. s.put("opo", "234");
    10. s.put("yyyy", "");
    11. String v2=s.put("opo", "[[[[");
    12. System.out.println(s);
    13. String v3=s.remove("opo");
    14. System.out.println(v3);
    15. System.out.println(s);
    16. }
    17. }

    2:Map的遍历

    (1)通过键找值的方式遍历

    1. package article;
    2. import java.util.Arrays;
    3. import java.lang.reflect.Array;
    4. import java.util.*;
    5. public class so {
    6. public static void main(String[] args) {
    7. Map s=new HashMap<>();
    8. String v1=s.put("jkjk", "123");
    9. s.put("opo", "234");
    10. s.put("yyyy", "");
    11. String v2=s.put("opo", "[[[[");
    12. System.out.println(s);
    13. Set ss=s.keySet();//获取到键并放入ss集合
    14. for(String k:ss) {
    15. String value=s.get(k);//通过键获取值
    16. System.out.println("键="+k+",值="+value);
    17. }
    18. }
    19. }

     (2)通过键值对对象遍历

    这种遍历方式是将键值对当做一个整体进行遍历,每次获取每个键值对对象中的键和值。

    1. package article;
    2. import java.util.Arrays;
    3. import java.lang.reflect.Array;
    4. import java.util.*;
    5. public class so {
    6. public static void main(String[] args) {
    7. Map s=new HashMap<>();
    8. String v1=s.put("jkjk", "123");
    9. s.put("opo", "234");
    10. s.put("yyyy", "");
    11. String v2=s.put("opo", "[[[[");
    12. Set > ss=s.entrySet();//获取键值对对象,并将其放入集合中
    13. for(Map.Entry oo:ss) {
    14. String key=oo.getKey();//获取键值对对象中的键
    15. String value=oo.getValue();//获取键值对对象中的值
    16. System.out.println("键="+key+" 值="+value);
    17. }
    18. }
    19. }

     (3)Lambda表达式遍历

    1. package article;
    2. import java.util.Arrays;
    3. import java.util.function.BiConsumer;
    4. import java.lang.reflect.Array;
    5. import java.util.*;
    6. public class so {
    7. public static void main(String[] args) {
    8. Map s=new HashMap<>();
    9. String v1=s.put("jkjk", "123");
    10. s.put("opo", "234");
    11. s.put("yyyy", "");
    12. String v2=s.put("opo", "[[[[");
    13. s.forEach(new BiConsumer(){
    14. @Override
    15. public void accept(String key, String value) {
    16. // TODO 自动生成的方法存根
    17. System.out.println("键="+key+" 值="+value);
    18. }
    19. });
    20. System.out.println("Lamda表达式再简化");
    21. s.forEach((String t, String u)-> {
    22. // TODO 自动生成的方法存根
    23. System.out.println("键="+t+" 值="+u);
    24. }
    25. );
    26. }
    27. }

     三、双列集合的使用

    1:HashMap

    HashMap也HashSet一样,都是基于哈希表的结构,特点都是无序,不重复,无索引。

    并且以来HashCode方法和equals方法保证键的唯一。如果键存储的是自定义对象,需要重写HashCode和equals方法,如果是值存储自定义对象,则不需要重写HashCode和equals方法。

    具体我们可以举两个例子感受下

    (1)定义一个学生对象,键存学生对象,值存储籍贯,姓名和年龄相同视为同一学生

    1. package article;
    2. import java.util.Objects;
    3. public class student {
    4. String name;
    5. int age;
    6. public student(String name,int age) {
    7. this.age=age;
    8. this.name=name;
    9. }
    10. public void setname(String name) {
    11. this.name=name;
    12. }
    13. public void setage(int age) {
    14. this.age=age;
    15. }
    16. public String getname() {
    17. return name;
    18. }
    19. public int getage() {
    20. return age;
    21. }
    22. @Override
    23. public int hashCode() {
    24. return Objects.hash(age, name);
    25. }
    26. @Override
    27. public boolean equals(Object obj) {
    28. if (this == obj)
    29. return true;
    30. if (obj == null)
    31. return false;
    32. if (getClass() != obj.getClass())
    33. return false;
    34. student other = (student) obj;
    35. return age == other.age && Objects.equals(name, other.name);
    36. }
    37. }
    38. package article;
    39. import java.util.Arrays;
    40. import java.util.function.BiConsumer;
    41. import java.lang.reflect.Array;
    42. import java.util.*;
    43. public class so {
    44. public static void main(String[] args) {
    45. Map s=new HashMap<>();
    46. student s1=new student("张三",10);
    47. student s2=new student("王五",20);
    48. student s3=new student("赵烈",30);
    49. student s4=new student("王五",20);
    50. s.put(s1,"安徽");
    51. s.put(s2, "江苏");
    52. s.put(s3, "浙江");
    53. s.put(s4, "天津");
    54. Set> ss=s.entrySet();
    55. for(Map.Entry gg:ss) {
    56. student key=gg.getKey();
    57. String value=gg.getValue();
    58. System.out.println("键中的名字="+key.getname()+"键中的年龄="+key.getage()+" 值中的籍贯="+value);
    59. }
    60. }
    61. }

    (2)ABCD四个景点,现在有80人,每个人只能去其中一个景点,统计每个景点去的人数,并输出去的人数最多的景点。

     

    1. package article;
    2. import java.util.Arrays;
    3. import java.util.function.BiConsumer;
    4. import java.lang.reflect.Array;
    5. import java.util.*;
    6. public class so {
    7. public static void main(String[] args) {
    8. //80人去的景点,我们用随机数来搞
    9. Random r=new Random();
    10. String[] a= {"A","B","C","D"};
    11. ArrayList s=new ArrayList<>();//存储的是80每个人去的景点
    12. for(int i=0;i<80;i++) {
    13. int index=r.nextInt(4);
    14. s.add(a[index]);
    15. }
    16. //现在每个人去的景点已经添加到s链表中
    17. Map h=new HashMap<>();
    18. for(String place:s) {
    19. if(h.containsKey(place)) {
    20. //地方已经存在
    21. int count=h.get(place);
    22. count++;
    23. h.put(place, count);
    24. }
    25. else {
    26. //第一个人去
    27. h.put(place,1);
    28. }
    29. }
    30. int ma=0;
    31. //遍历输出
    32. Set> gg=h.entrySet();
    33. for(Map.Entry oo:gg) {
    34. String key=oo.getKey();
    35. int value=oo.getValue();
    36. if(ma
    37. ma=value;
    38. }
    39. System.out.println("去"+key+"的人数="+value);
    40. }
    41. //求最大人数
    42. System.out.println("最大人数="+ma);
    43. }
    44. }

     2:LinkedHashMap

    LinkedHashMap特点:有序,不重复,无索引。

    注意不重复是键不可重复,值是可以重复的。同时它的底层实现结构是哈希表和双向链表。

    1. package article;
    2. import java.util.Arrays;
    3. import java.util.Map.Entry;
    4. import java.util.function.BiConsumer;
    5. import java.lang.reflect.Array;
    6. import java.util.*;
    7. public class so {
    8. public static void main(String[] args) {
    9. Map s=new LinkedHashMap<>();
    10. s.put("909", 100);
    11. s.put("sd", 1);
    12. s.put(">>>>", 100);
    13. Set> ss=s.entrySet();
    14. for(Entry oo:ss) {
    15. String key=oo.getKey();
    16. int value=oo.getValue();
    17. System.out.println("键="+key+" 值="+value);
    18. }
    19. }
    20. }

    3:TreeMap

    TreeMap的特点:可排序,不重复,无索引。默认按照键的从小到大进行排序,也可按照自己定义的规则进行排序。对于它的排序与TreeSet也是一样的,有两种方法进行排序。一种是使用比较器进行排序,一种是使用Comparable接口进行排序。

    (1)Comparable接口排序

     这里的this表示当前添加进去的,o表示的是已经存在的。我这里是先按照年龄从小到大,年龄一样按照名字从小到大排序。大家不理解就记住this在前表示是升序(从小到大)

    1. package article;
    2. import java.util.Objects;
    3. public class student implements Comparable{
    4. String name;
    5. int age;
    6. public student(String name,int age) {
    7. this.age=age;
    8. this.name=name;
    9. }
    10. public void setname(String name) {
    11. this.name=name;
    12. }
    13. public void setage(int age) {
    14. this.age=age;
    15. }
    16. public String getname() {
    17. return name;
    18. }
    19. public int getage() {
    20. return age;
    21. }
    22. @Override
    23. public int compareTo(student o) {
    24. // TODO 自动生成的方法存根
    25. int t=this.age-o.age;
    26. if(t==0) {
    27. return this.name.compareTo(o.name);
    28. }
    29. return t;
    30. }
    31. }
    32. package article;
    33. import java.util.Arrays;
    34. import java.util.Map.Entry;
    35. import java.util.function.BiConsumer;
    36. import java.lang.reflect.Array;
    37. import java.util.*;
    38. public class so {
    39. public static void main(String[] args) {
    40. Map s=new TreeMap<>();
    41. student s1=new student("abc",19);
    42. student s2=new student("bnc",19);
    43. student s3=new student("acc",19);
    44. student s4=new student("adddd",19);
    45. student s5=new student("nzbs",20);
    46. student s6=new student("qqss",3);
    47. student s7=new student("poojs",30);
    48. s.put(s1,"安徽");
    49. s.put(s2, "安徽");
    50. s.put(s3, "天津");
    51. s.put(s4, "浙江");
    52. s.put(s5, "安徽");
    53. s.put(s6, "天津");
    54. s.put(s7, "浙江");
    55. Set> ss=s.entrySet();
    56. for(Map.Entry oo:ss) {
    57. student key=oo.getKey();
    58. String value=oo.getValue();
    59. System.out.println("键中名字="+key.getname()+" 键中年龄="+key.getage()+" 值="+value);
    60. }
    61. }
    62. }

     (2)Comparator比较器排序

    这里我将排序规则修改了下,按照年龄从大到小排序,如果年龄相同,则按照名字从大到小进行排序。这里大家不理解,就可以这样理解o1在前就是升序,o2在前就是降序。(嗯,死记硬背吧,哈哈哈)

    1. package article;
    2. import java.util.Arrays;
    3. import java.util.Map.Entry;
    4. import java.util.function.BiConsumer;
    5. import java.lang.reflect.Array;
    6. import java.util.*;
    7. public class so {
    8. public static void main(String[] args) {
    9. Map s=new TreeMap<>(new Comparator() {
    10. @Override
    11. public int compare(student o1, student o2) {
    12. // TODO 自动生成的方法存根
    13. int t=o2.age-o1.age;
    14. if(t==0) {
    15. return o2.name.compareTo(o1.name);
    16. }
    17. return t;
    18. }
    19. });
    20. student s1=new student("abc",19);
    21. student s2=new student("bnc",19);
    22. student s3=new student("acc",19);
    23. student s4=new student("adddd",19);
    24. student s5=new student("nzbs",20);
    25. student s6=new student("qqss",3);
    26. student s7=new student("poojs",30);
    27. s.put(s1,"安徽");
    28. s.put(s2, "安徽");
    29. s.put(s3, "天津");
    30. s.put(s4, "浙江");
    31. s.put(s5, "安徽");
    32. s.put(s6, "天津");
    33. s.put(s7, "浙江");
    34. Set> ss=s.entrySet();
    35. for(Map.Entry oo:ss) {
    36. student key=oo.getKey();
    37. String value=oo.getValue();
    38. System.out.println("键中名字="+key.getname()+" 键中年龄="+key.getage()+" 值="+value);
    39. }
    40. }
    41. }

    提醒大家,排序排序,这里的排序都是按照键来排序,千万不要扯到值上了。

  • 相关阅读:
    【NOIP2018模拟10.30】Idioms 题解
    猿创正文|C++——模板初阶|泛型编程|函数模板|函数模板概念 |函数模板格式|函数模板的实例化|模板参数的匹配原则|类模板 |类模板定义格式|习题
    【Ubuntu】Anaconda的安装和使用
    人工智能 | AI芯片类型:CPU GPU TPU DPU NPU BPU
    K210(SiPEED MaixBit)MicroPython使用参考(十、MAX98357A的I2S驱动)
    【Qt炫酷动画】专栏导航目录
    如何理解分布式架构和微服务架构呢
    前端程序员如何使用GPT
    索尼 toio™ 应用创意开发征文|教育与游戏的完美融合:toio™核心Q宝引领数字学习新潮流
    Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序
  • 原文地址:https://blog.csdn.net/gaoqiandr/article/details/127892284