Map

Posted linlin1211

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Map相关的知识,希望对你有一定的参考价值。

一.Map的概述
  1.什么是Map集合
    Collection称为单列集合,元素的孤立存在的
    Map称为双列集合
    注意:Collection是单集合的根接口
       Map是双列集合的根接口
  2.Map集合的特点
    a.Collection元素是孤立的,Map的成对的
    b.Map集合的键不能重复(唯一的),值是可以重复的,通过键能找到一个值。
二.Map集合中常用子类
  1.HashMap集合介绍
    底层是哈希表结构
    无序的
  2.LinkedHashMap集合的介绍
    底层是链表+哈希表结构
    有序的
  3.Map接口中通用的方法
    增:public put(K 键,V 值);向Map集合中添加一个键值对。返回被覆盖的键值对的值
    删:public remove(K 键);根据键,删除集合中键值对。返回被删除的键值对的值
    改:无
    查:public get(K 键值);根据键 获取集合中的对应值
    其他:
      public boolean containsKey(K key);//判断集合中是否包含指定的键
      public int size();//返回Map中键值对的个数
    代码:

 public static void main(String[] args) {
      //1.使用Map集合 进行增删改查
      //实现类:HashMap(无序) LinkHashMap(有序)
      Map<String,Integer> map=new HashMap<String, Integer>();
      //2.添加键值对
        map.put("小米6p",1988);
        map.put("vivo",18784);
        map.put("oppo",1525);
        map.put("苹果",8542);
      //3.删除
        map.remove("vivo");
      //4.修改
        map.put("oppo",2000);
        System.out.println(map);
      //5.个数
        int size = map.size();
        System.out.println(size);
      //6.判断包不包含这个键
        boolean vivo = map.containsKey("vivo");
        System.out.println(vivo);
        }

  4.Map的遍历方式一:以键找值的方式
    注意:Map集合 第一没有下标 第二也没有继承Collection所以没有迭代器
    代码:

 public static void main(String[] args) {
      Map<String,Integer> map=new HashMap<String, Integer>();
      map.put("小米6p",1988);
      map.put("vivo",18784);
      map.put("oppo",1525);
      map.put("苹果",8542);
      //遍历:以键找值
      Set<String> keySet= map.keySet();
      //使用迭代器
      Iterator<String> iterator = keySet.iterator();
      //标准遍历
      while (iterator.hasNext()){
      String key = iterator.next();
      Integer value = map.get(key);
      System.out.println(key+"="+value);
        }

      }

    5.Map的遍历方式二:键值对(Entry)方式

    代码:

public static void main(String[] args) {
      Map<String,Integer> map=new HashMap<String, Integer>();
      map.put("小米6p",1988);
      map.put("vivo",18784);
      map.put("oppo",1525);
      map.put("苹果",8542);
      //遍历:以键找值
      Set<String> keySet= map.keySet();
      //使用迭代器
      Iterator<String> iterator = keySet.iterator();
      //标准遍历
      while (iterator.hasNext()){
      String key = iterator.next();
      Integer value = map.get(key);
      System.out.println(key+"="+value);
        }
      }

  6.练习1:使用HashMap保存自定义对象
    Student类:

     public class Student {
      private String name;
      private int age;

      public Student(String name, int age) {
      this.name = name;
      this.age = age;
      }

      public Student() {
      }

      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 String toString() {
      return "Student{" +
      "name=‘" + name + ‘‘‘ +
      ", age=" + age +
      ‘}‘;
      }

      @Override
      public boolean equals(Object o) {
      if (this == o) return true;
      if (!(o instanceof Student)) return false;
      Student student = (Student) o;
      return age == student.age &&
      Objects.equals(name, student.name);
      }

      @Override
      public int hashCode() {

      return Objects.hash(name, age);
      }
      }
    实现类:
      public static void main(String[] args) {
      Map<Student,String> map=new HashMap<Student, String>();
      //2.添加数据
      map.put(new Student("小草",5),"北京");
    map.put(new Student("小花",1),"北京");
    map.put(new Student("小树",4),"上海");
    map.put(new Student("小苗",8),"深圳");
    map.put(new Student("小虾",66),"西安");
    System.out.println(map);
    map.put(new Student("小草",5),"北京");
    System.out.println(map);
    }

  7.练习2:使用LinkedHashMap保存自定义对象
    实现类:

/练习,每位学生(姓名,年龄)都有自己的家庭住址,学生作为键,家庭住址为值
//1.定义Map集合
Map<Student,String> map=new LinkedHashMap<Student, String>();
//2.添加数据
map.put(new Student("小草",5),"北京");
map.put(new Student("小花",5),"北京");
map.put(new Student("小树",5),"上海");
map.put(new Student("小苗",5),"深圳");
map.put(new Student("小虾",5),"西安");
//1.第一种遍历方法
Set<Student> students = map.keySet();
Iterator<Student> iterator = students.iterator();
while (iterator.hasNext()){
Student next = iterator.next();
String s = map.get(next);

System.out.println(s+","+next);
}
System.out.println("==================");
//2.第二种遍历方法
Set<Map.Entry<Student, String>> entries = map.entrySet();
for (Map.Entry<Student, String> entry : entries) {
Student key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}

}

    注意:
      使用hashSet或者LinkedMap保证自定义的键时,由于我们保证键的唯一性
      必须重写自定义类中的HahCode和equals
  8.Map集合综合练习
    需求:
      计算一个字符串中每种字符出现次数
    思考:
      以上这种题目,必须使用Map<Character ,Integer>
    步骤
      a.定义Map集合,保存字符和对应的次数
      b.遍历字符串,取出每一个字符
      c.如果该字符在Map中已经出现了,那么需要把出现次数增加一
        如果该字符在Map中没有出现,那么需要添加集合中添加该字符,并且为1
      d.打印Map集合
    代码:

public static void main(String[] args) {
//控制台输入字符串
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串");
String next = scanner.next();
//定义Map集合,保存字符和对应的次数
HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
//遍历字符串,取出每一个字符
for (int i = 0; i < next.length(); i++) {
char c = next.charAt(i);
if (hashMap.containsKey(c)){
hashMap.put(c,hashMap.get(c)+1);
}else {
hashMap.put(c,1);
}

}
System.out.println(hashMap);
}

三.补充知识点
  1.JDK快速创建集合的方法
      List<Integer> nums=List.of(10,20,30,40,50);
      Set<String> set=Set.of("a","b","c","d");
      Map<String,Integer> map=Map.of("张三",18,"李四",19,"王五",20);
  2.快速创建集合的注意事项
      使用以上三种方式创建的集合,得到的集合都是不可变的集合
      对不可变集合进行添加,删除,修改,都会抛出UnsupportedOperationException
  3.Debug模式追踪

    F8:代码向下执行一行
    F7:进入某个方法
    Ctrl+F2:立即停止程序
    F9:运行到下一个断点处,如果没有下一个断点,运行完毕整个程序
四.模拟斗地主案例
  核心:为每一张牌,设置一个编号,要求牌越大 编号越大
  步骤分析:
    1.需要准备编号和牌对应的Map<Integer,String>集合
    2.准备一副牌(54个编号)
    3.洗牌(编号集合)
    4.发牌(编号)
    5.排序(编号)
    6.转牌(把编号转成对应的牌)
    7.看牌
  代码实现:

    public static void main(String[] args) {
//        1.需要准备编号和牌对应的Map<Integer,String>集合
        ArrayList<Integer> cardsBox = new ArrayList<Integer>();
        LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
        String[] colars = {"?", "?", "?", "?"};
        String[] Licensing = {"3", "4", "5", "6", "7", "8", "9", "10", "j", "Q", "K", "A", "2"};
//产生编号和牌
        int id = 1;
        //注意:这里必须外层先遍历 数字,内遍历花色
        for (String s : Licensing) {
            for (String colar : colars) {
                //连接牌
                String s1 = colar + s;
                //保存到map中
                map.put(id, s1);
                //同时添加牌
                cardsBox.add(id);
                id++;

            }
        }
        map.put(id, "小s");
        cardsBox.add(id);
        id++;
        map.put(id, "大s");
        cardsBox.add(id);

        //准备一副牌(54个编号)
        System.out.println(cardsBox);
//        3.洗牌(编号集合)
        Collections.shuffle(cardsBox);
//       3.发牌(剩余3张,作为底牌)
        ArrayList<Integer> p1 = new ArrayList<Integer>();
        ArrayList<Integer> p2 = new ArrayList<Integer>();
        ArrayList<Integer> p3 = new ArrayList<Integer>();
        ArrayList<Integer> ps = new ArrayList<Integer>();
//        4.发牌(编号)
        for (int i = 0; i< cardsBox.size(); i++) {
            //先取出牌
            Integer s = cardsBox.get(i);
            if (i >= 51) {
                ps.add(s);
            } else {
                if (i % 3 == 0) {
                    p1.add(s);
                } else if (i % 3 == 1) {
                    p2.add(s);
                } else {
                    p3.add(s);
                }
            }
        }

        System.out.println(cardsBox);

//        5.排序(编号)
        System.out.println(cardsBox);
        Collections.sort(p1);
        Collections.sort(p2);
        Collections.sort(p3);
        Collections.sort(ps);
//        6.转牌(把编号转成对应的牌)

        lookCards(p1, map);
        lookCards(p2, map);
        lookCards(p3, map);
        lookCards(ps, map);

    }

    //转牌,看牌
    private static void lookCards(ArrayList<Integer> p1, Map<Integer, String> map) {
        //1.遍历集合取出所有的编号
        for (Integer carId : p1) {
            String s = map.get(carId);
            System.out.print(s+" ");

        }
        System.out.println();
    }
    /**
     * 目前是按照升序排序的
     * 修改成降序
     *      方法1:倒叙遍历玩家的编号
     *      方法2:定义map集合时牌越大编号越小
     *      方法3:Collection.sort(集合,自定义比较器)
     */
}

  注意:
    sort(List<T> list);//根据元素的自然顺序对指定列表按升序进行排序

 




































































以上是关于Map的主要内容,如果未能解决你的问题,请参考以下文章

android google map supportmap片段无法在片段中初始化

比较有用的php代码片段

JavaScript 代码片段

代码片段 - Golang 实现集合操作

Android Studio Map setOnMarkerClickListener 不在片段上工作

48个值得掌握的JavaScript代码片段(上)