Map集合的五种遍历方式及Treemap方法_Camel-程序员宝宝_map遍历

技术标签: 集合  java  Java基础知识课程  treemap  遍历  MAP  

Map集合:链接: Map集合的五种遍历方式及Treemap方法
Set集合:链接: Java中遍历Set集合的三种方法
TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法
LIst集合:链接: Java中List集合的三种遍历方式(全网最详)
集合区别:链接: java中list,set,map集合的区别,及面试要点

//循环遍历map的方法
public class MapF {
    
 public static void main(String[] args) {
    
  Map<String, Integer> tempMap = new HashMap<String, Integer>();
  tempMap.put("a","12");
  tempMap.put("b","34");
  tempMap.put("c","56");
  // JDK1.4中
  // 遍历方法一 hashmap entrySet() 遍历
  Iterator it = tempMap.entrySet().iterator();
  while (it.hasNext()) {
    
   Map.Entry entry = (Map.Entry) it.next();
   Object key = entry.getKey();
   Object value = entry.getValue();
   System.out.println("key=" + key + " value=" + value);
  }
  System.out.println("");
  // JDK1.5中,应用新特性For-Each循环
  // 遍历方法二
  for (Map.Entry<String, Integer> entry : tempMap.entrySet()) {
    
   String key = entry.getKey().toString();
   String value = entry.getValue().toString();
   System.out.println("key=" + key + " value=" + value);
  }
  System.out.println("");
  // 遍历方法三 hashmap keySet() 遍历
  for (Iterator i = tempMap.keySet().iterator(); i.hasNext();) {
    
   Object obj = i.next();
   System.out.println(obj);// 循环输出key
   System.out.println("key=" + obj + " value=" + tempMap.get(obj));
  }
  for (Iterator i = tempMap.values().iterator(); i.hasNext();) {
    
   Object obj = i.next();
   System.out.println(obj);// 循环输出value
  }
  // 遍历方法四 treemap keySet()遍历
  for (Object o : tempMap.keySet()) {
    
   System.out.println("key=" + o + " value=" + tempMap.get(o));
  }
  System.out.println("11111");
  // java如何遍历Map <String, ArrayList> map = new HashMap <String,
  // ArrayList>();
  System.out.println("java  遍历Map <String, ArrayList> map = new HashMap<String, ArrayList>();");
  Map<String, ArrayList> map = new HashMap<String, ArrayList>();
  Set<String> keys = map.keySet();
  Iterator<String> iterator = keys.iterator();
  while (iterator.hasNext()) {
    
   String key = iterator.next();
   ArrayList arrayList = map.get(key);
   for (Object o : arrayList) {
    
    System.out.println(o);
   }
  }
  Map<String, List> map = new HashMap<String, List>();
  for (Map.Entry entry : map.entrySet()) {
    
   String key = entry.getKey().toString();
   List<String> list= (List) entry.getValue();
   for (String value : list) {
    
    System.out.println(key + "====" + value);
   }
  }
 }
}

Map接口简介

今天来看一看map集合,map映射接口,用于存放键值对,<key,value>,通过key来查找value,顾名思义key不能为空,唯一且不重复,不然底层怎么查呢!

可以从图中看出Map为单独的接口,他和Collection有什么区别呢?

Map和Collection在集合中并列存在。 
Map集合是双列的,键值对,而Collection是单列集合
Map存储元素使用put方法,Collection使用Put方法。
Map遍历没有直接取出元素的方法,而是先转成Set集合,再通过迭代获取元素。
 --Map常用方法
  
–Map应用
添加:使用HashMap。立了学生姓名和年龄之间的映射关系。并试图添加重复的键

复制代码
   public static void main(String[] args) {
    
        // 定义一个Map的容器对象  
        Map<String, Integer > map1 = new HashMap<String, Integer >();  
        map1.put("jack", 20);  
        map1.put("rose", 18);  
        map1.put("lucy", 17);  
        map1.put("java", 25);
      // map1.put("jack", 30); 在没有hashCode和equals方式   添加重复的键值(值不同),会覆盖掉前面key值相同的值
        System.out.println(map1);  
      
        Map<String, Integer> map2 = new HashMap<String, Integer>();  
        map2.put("张三丰", 100);  
        map2.put("虚竹", 20);  
        System.out.println("map2:" + map2);  
        // 从指定映射中将所有映射关系复制到此映射中。  
        map1.putAll(map2);  
        System.out.println("map1:" + map1);  
    }  
复制代码

删除:

复制代码
   public static void main(String[] args) {
       
   // 删除:  
        // remove() 删除关联对象,指定key对象  
        // clear() 清空集合对象  
  
        Map<String, Integer> map1 = new HashMap<String, Integer>();  
        map1.put("jack", 20);  
        map1.put("rose", 18);  
        map1.put("lucy", 17);  
        map1.put("java", 25);  
        System.out.println(map1);                 
        // 指定key,返回删除的键值对映射的值。  
        map1.remove("java");
        System.out.println(map1);  
        map1.clear();  
        System.out.println("map1:" + map1);  
    }  
复制代码

获取:

复制代码
public static void main(String[] args) {
    
     // 获取:  
        // V get(Object key) 通过指定的key对象获取value对象  
        // int size() 获取容器的大小  
        Map<String, Integer> map1 = new HashMap<String, Integer>();  
        map1.put("jack", 20);  
        map1.put("rose", 18);  
        map1.put("lucy", 17);  
        map1.put("java", 25);  
        System.out.println(map1);  
        // V get(Object key) 通过指定的key对象获取value对象  
        System.out.println("value:" + map1.get("jack"));  
        // int size() 获取容器的大小
        System.out.println("map.size:" + map1.size()); 
    } 
复制代码

判断:

复制代码
public static void main(String[] args) {
    
        // 判断:  
        // boolean isEmpty() 判断集合是否为空   长度为0返回true否则false  
        // boolean containsKey(Object key) 判断集合中是否包含指定的key  
        // boolean containsValue(Object value)  
  
        Map<String, Integer> map1 = new HashMap<String, Integer>();  
        map1.put("jack", 20);  
        map1.put("rose", 18);  
        map1.put("lucy", 17);  
        map1.put("java", 25);  
        System.out.println(map1);  
        System.out.println("isEmpty:" + map1.isEmpty());  
        System.out.println("containskey:" + map1.containsKey("jack"));  
        System.out.println("containsvalues:" + map1.containsValue(100));  
    }  
复制代码

遍历Map的4中方式:

第一种:

复制代码

public static void main(String[] args) {
    
        //遍历Map 第一种方式
        Map<String, Integer> map1 = new HashMap<String, Integer>();  
        map1.put("jack", 20);  
        map1.put("rose", 18);  
        map1.put("lucy", 17);  
        map1.put("java", 25);  
        
        //通过 map1.keySet() 获取key  通过key 找到value
        for (String key : map1.keySet()) {
    
            Integer value = map1.get(key);
            System.out.println("key : "+key+" value : "+value);
        }
    }
复制代码
第二种:
复制代码
public static void main(String[] args) {
    
        //遍历Map 第二种方式
        Map<String, Integer> map1 = new HashMap<String, Integer>();  
        map1.put("jack", 20);  
        map1.put("rose", 18);  
        map1.put("lucy", 17);  
        map1.put("java", 25);  
        
       //通过Map.Entry(String,Integer) 获取,然后使用entry.getKey()获取到键,通过entry.getValue()获取到值
       for(Map.Entry<String, Integer> entry : map1.entrySet()){
    
           System.out.println("键 key :"+entry.getKey()+" 值value :"+entry.getValue());
       }
    }
复制代码
第三种:
复制代码
//遍历Map 第三种方式
        Map<String, Integer> map1 = new HashMap<String, Integer>();  
        map1.put("jack", 20);  
        map1.put("rose", 18);  
        map1.put("lucy", 17);  
        map1.put("java", 25);  
        //第三种只遍历键或者值,通过加强for循环
        for(String s1:map1.keySet()){
    //遍历map的键
           System.out.println("键key :"+s1);
        }
        for(Integer s2:map1.values()){
    //遍历map的值
            System.out.println("值value :"+s2);
        }
           System.out.println("====================================");    
    }
复制代码
第四种:
复制代码
public static void main(String[] args) {
    
        //遍历Map 第一种方式
        Map<String, Integer> map1 = new HashMap<String, Integer>();  
        map1.put("jack", 20);  
        map1.put("rose", 18);  
        map1.put("lucy", 17);  
        map1.put("java", 25);  
        
        //第四种Iterator遍历获取,然后获取到Map.Entry<String, String>,再得到getKey()和getValue()
        Iterator<Map.Entry<String, Integer>> it=map1.entrySet().iterator();
        while(it.hasNext()){
    
            Map.Entry<String, Integer> entry=it.next(); 
            System.out.println("键key :"+entry.getKey()+" value :"+entry.getValue());
        }
        
    }
复制代码

HashMap

底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。要保证键的唯一性,需要覆盖hashCode方法,和equals方法。
   案例:自定义对象作为Map的键。

复制代码
    public class Demo3 {
      
        public static void main(String[] args) {
      
            HashMap<Person, String> hm = new HashMap<Person, String>();  
            hm.put(new Person("jack", 20), "1001");  
            hm.put(new Person("rose", 18), "1002");  
            hm.put(new Person("lucy", 19), "1003");  
            hm.put(new Person("hmm", 17), "1004");  
            hm.put(new Person("ll", 25), "1005");  
            System.out.println(hm);  
            System.out.println(hm.put(new Person("rose", 18), "1006"));  //重写hashCode和equalse后key相同不会覆盖
      
            Set<Entry<Person, String>> entrySet = hm.entrySet();  
            Iterator<Entry<Person, String>> it = entrySet.iterator();  
            while (it.hasNext()) {
      
                Entry<Person, String> next = it.next();  
                Person key = next.getKey();  
                String value = next.getValue();  
                System.out.println(key + " = " + value);  
            }  
        }  
    }  
      
    class Person {
      
        private String name;  
        private int age;  
      
        Person() {
      
      
        }  
      
        public Person(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 int hashCode() {
      
      
            return this.name.hashCode() + age * 37;  
        }  
      
        @Override  
        public boolean equals(Object obj) {
      
            if (obj instanceof Person) {
      
                Person p = (Person) obj;  
                return this.name.equals(p.name) && this.age == p.age;  
            } else {
      
                return false;  
            }  
        }  
      
        @Override  
        public String toString() {
      
      
            return "[email protected]:" + this.name + " age:" + this.age;  
        }  
      
    }  
    }  
复制代码

TreeMap

TreeMap的排序,TreeMap可以对集合中的键进行排序。如何实现键的排序?

方式一:元素自身具备比较性

和TreeSet一样原理,需要让存储在键位置的对象实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做  元素的自然排序也叫做默认排序。

方式二:容器具备比较性

当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重  写compare方法,并将该接口的子类实例对象作为参数传递给TreeMap集合的构造方法。

注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;

注意:在重写compareTo或者compare方法时,必须要明确比较的主要条件相等时要比较次要条件。(假设姓名和年龄一致的人为相同的人,  如果想要对人按照年龄的大小来排序,如果年龄相同的人,需要如何处理?不能直接return 0,以为可能姓名不同(年龄相同姓名不同的人  是不同的人)。此时就需要进行次要条件判断(需要判断姓名),只有姓名和年龄同时相等的才可以返回0.)

通过return 0来判断唯一性。

public class Demo4 {
     
    public static void main(String[] args) {
     
        TreeMap<String, Integer> tree = new TreeMap<String, Integer>(); 
        tree.put("张三", 19); 
        tree.put("李四", 20); 
        tree.put("王五", 21); 
        tree.put("赵六", 22); 
        tree.put("周七", 23); 
        tree.put("张三", 24); 
        System.out.println(tree); 
        System.out.println("张三".compareTo("李四"));//-2094 
    } 
} 

自定义元素排序

复制代码
    public class Demo3 {
      
        public static void main(String[] args) {
      
            TreeMap<Person, String> hm = new TreeMap<Person, String>(  
                    new MyComparator());  
            hm.put(new Person("jack", 20), "1001");  
            hm.put(new Person("rose", 18), "1002");  
            hm.put(new Person("lucy", 19), "1003");  
            hm.put(new Person("hmm", 17), "1004");  
            hm.put(new Person("ll", 25), "1005");  
            System.out.println(hm);  
            System.out.println(hm.put(new Person("rose", 18), "1006"));  
      
            Set<Entry<Person, String>> entrySet = hm.entrySet();  
            Iterator<Entry<Person, String>> it = entrySet.iterator();  
            while (it.hasNext()) {
      
                Entry<Person, String> next = it.next();  
                Person key = next.getKey();  
                String value = next.getValue();  
                System.out.println(key + " = " + value);  
            }  
        }  
    }  
      
    class MyComparator implements Comparator<Person> {
      
      
        @Override  
        public int compare(Person p1, Person p2) {
      
            if (p1.getAge() > p2.getAge()) {
      
                return -1;  
            } else if (p1.getAge() < p2.getAge()) {
      
                return 1;  
            }  
            return p1.getName().compareTo(p2.getName());  
        }  
      
    }  
      
    class Person implements Comparable<Person> {
      
        private String name;  
        private int age;  
      
        Person() {
      
      
        }  
      
        public Person(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 int hashCode() {
      
      
            return this.name.hashCode() + age * 37;  
        }  
      
        @Override  
        public boolean equals(Object obj) {
      
            if (obj instanceof Person) {
      
                Person p = (Person) obj;  
                return this.name.equals(p.name) && this.age == p.age;  
            } else {
      
                return false;  
            }  
        }  
      
        @Override  
        public String toString() {
      
      
            return "[email protected]:" + this.name + " age:" + this.age;  
        }  
      
        @Override  
        public int compareTo(Person p) {
      
      
            if (this.age > p.age) {
      
                return 1;  
            } else if (this.age < p.age) {
      
                return -1;  
            }  
            return this.name.compareTo(p.name);  
        }  
      
    }  
复制代码

注意:Set的元素不可重复,Map的键不可重复,如果存入重复元素如何处理

Set元素重复元素不能存入add方法返回false

Map的重复健将覆盖旧键,将旧值返回。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30225725/article/details/88019622

智能推荐

设备树dts详解_IT利刃出鞘的博客-程序员宝宝_of_alias_get_id

目录相关网址相关文档DTS文件结构DTS语法1.Property2. key的分类3. dt保留的key及其意义4. 引用其他节点或属性5.引用、合并、替换其他语法常用函数a. 处理DTBb. 处理device_nodec. 处理 platform_deviced. 其他函数相关网址设备树用法(官方英文) ...

nacos本地启动爬坑_掉入坑中正在往上爬的猿的博客-程序员宝宝_nacos新增配置需要重启吗

什么是nacos请移步到这里 :https://nacos.io/zh-cn/docs/what-is-nacos.html由于nacos版本升级,内嵌数据库已被替换,需要做一些修改;不过下载release版本时,可一键启动;这里主要将一下下载nacos源码到本地启动时遇到的几个坑;1:修改数据库源码中config模块中的文件——nacos-db.sql ,放在自己本地的...

安装vm tools_aiqieer2126的博客-程序员宝宝

一、安装VMtools点击VMware菜单的——虚拟机——安装VMware Tools,在弹出的对话框中选择“安装”。这时,在Ubuntu下会自动加载Linux版的VMware Tools的安装光盘镜像。你会看到虚拟机的桌面上出现了一个名为VMware Tools的光盘图标,并且被自动打开。其中包括VMwareTools-5.3.3-34685-i386.rpm和VMwareTool...

opencv3.4.1+vs2015配置问题解决_weixin-W1623210897的博客-程序员宝宝

有些小伙伴安装完vs2015,opencv3.4.1,设置好环境变量,项目属性,发现该做的都做了,却依然运行不了,可以试试下面这个方法,希望帮到小伙伴! 找到\opencv\build\x64\vc14\lib  找个以下这两个lib(在opencv存放的文件夹找) 找到c盘这个目录          C:\Windows\System32    将上面两个lib复制粘贴进来,...

基于docker搭建MulVAL攻击图_ailx10的博客-程序员宝宝

拥抱docker,经常做了一些好玩的东西,想在别人的电脑上运行,都发现一堆问题,不是少一个依赖,就是缺一个环境变量,好不郁闷。于是,将目光锁定在了docker上,只要大家都有docker,自己本地能跑的,在别人电脑上也能跑,完美解决环境问题。使用docker渐渐成为一种趋势,云计算、微服务都在使用docker,为了与时俱进,我也趟一趟这浑水。上一次接触docker已经是一年前了,当时刚刚加入态势感...

随便推点

Cisco lightweight AP 变 Autonomous AP_weixin_34220834的博客-程序员宝宝

7月29日中午要调试公司订购的思科无线AP,我们使用的型号是air-lap 1142n-c-k9。思科有两种AP(Access Point), Lightweight AP 和Autonomous AP, 轻量AP和自治AP。由于无线控制器还没到货,需要临时配置两个AP为自治模式,先在仓库用起来。Lightweight AP通过无线控制器WLC来集中管理,它的缺点是通过c...

在jetson nano上安装anaconda_秉真的博客-程序员宝宝_anaconda jetson nano

在Jetson Nano (TX1/TX2)上使用Anaconda与PyTorch 1.1.0(注意:以下内容只在Jetson Nano上尝试过,但理论上来说采用了相同架构, i.e. ARM A57,的TX1/TX2应该都可以,但AGX Xaiver不是很确定)今天入手了一块Jetson Nano。心里幻想着能结合IoT做一些AI-based应用。结果到手之后傻眼了——Jetson系列是基...

第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结_天地会珠海分舵的博客-程序员宝宝

最后我们对MonkeyRunner启动的过程做一个总结,当然,其中也包括启动Monkey,虽然它不属于启动过程的一部分:monkeyrunner这个shell脚本会先设置一些运行环境的系统属性保存到JVM的System.Propery里面然后该脚本会通过java -jar直接运行sdk下面的monkeyruner.jar然后操作系统直接回调到monkeyrunner在MonkeyRunnerSta

day02 标识符,变量,进制转换_一饮醉千秋的博客-程序员宝宝

2.1 关键字和保留字定义:被java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母小写保留字:goto const 现有java版本尚未使用,以后可能会使用,避开保留字

Maven中 SLF4J: Class path contains multiple SLF4J bindings. 的解决方法_nsnvainva的博客-程序员宝宝

问题:SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/D:/Maven/MavenRepository/org/slf4j/slf4j-jdk14/1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLogger...

mysql内连接查询练习_MySQL 外连接、内连接,连接查询、多表查询、子查询、视图..._我本废柴的博客-程序员宝宝

MySQL连接查询、多表查询、子查询:连接查询:事先将两张或多张表join,根据join的结果进行查询;【导入hellodb.sql数据库】,输入密码即可[[email protected]]#mysql-uroot-pmydb【查看students表】mysql&gt;select*fromstudents;+-------+---------------+-----+----...

推荐文章

热门文章

相关标签