zoukankan      html  css  js  c++  java
  • 浅谈集合框架三、Map常用方法及常用工具类

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出。初学者对于本篇博客只建议作为参考,欢迎留言共同学习。

      之前有介绍集合框架的体系概念(http://www.cnblogs.com/yjboke/p/8761195.html),本篇介绍一下Map的常用方法及常用工具类。


     map基本查询方法:

      增加:put、putAll;

      删除:remove(输如键进行删除)、clear(删除集合所有元素)

      查询:get(输入键查询值)、size(查询集合长度)、values(查询所有值)

      判断:containsKey(判断键是否存在)、containsValue(判断值是否存在)、isEmpty(判断集合是否为null)

      具体操作方式可参考下方代码:

    HashMap<Integer, String> map = new HashMap<Integer, String>();
            
            map.put(1001, "zhangsan");                        
            map.put(1003, "lisi");
            map.put(1002, "wangwu");
            map.put(1004, "maliu");
            map.put(1004, "houqi");
            map.put(null, "ainiyou");                        //添加元素,可添加重复的键,但值会覆盖原所对应的值,可添加null,但只能有1个null。
            
            System.out.println(map);                         //输出:{null=ainiyou, 1001=zhangsan, 1002=wangwu, 1003=lisi, 1004=houqi}
            System.out.println(map.remove(1002));            //删除键为1002的键值对,并输出值“wangwu”,如没有该键,则输出null
            System.out.println(map);
            System.out.println(map.get(1002));               //查询键所对应的值,如没有该键,则输出null。
            System.out.println(map.get(null));               //可直接查询null,输出对应的值:“ainiyou”
            System.out.println(map.size());                  //输出集合长度
            System.out.println(map.values());                //输出所有的值:[ainiyou, zhangsan, lisi, houqi]
            System.out.println(map.containsKey(1002));       //判断键是否存在,返回boolean
            System.out.println(map.containsValue("lisi"));   //判断值是否存在,返回boolean
            map.clear();                                     //删除所有元素
            System.out.println(map.isEmpty());               //判断是否为null,现已被清空,返回true

      基本操作方式如上,但是map集合不可直接使用迭代器输出元素,如果有需求的同学可以参考以下两种方法:

        keySet:

         Set<Integer> si = map.keySet();                                    //使用keySet方法获取所有的key,并存到Set集合中
            for(Iterator<Integer> it = si.iterator(); it.hasNext();){        //将Set集合迭代输出
                Integer key = it.next();                                    //获取key
                String value = map.get(key);                                //获取key所对应的value
                System.out.println("key:"+key + "; value :"+ value);        //输出key和value
            }

        entry:

      Set<Map.Entry<Integer, String>> entrySet = map.entrySet();                                //定义entrySet方法的set集合,去除key和value值
            for(Iterator<Map.Entry<Integer, String>> it = entrySet.iterator(); it.hasNext(); ){     //使用迭代器取出key和value值
                Map.Entry<Integer, String> me = it.next();                                          //将值存入me中
                Integer key = me.getKey();                                                          //分别取出
                String value = me.getValue();
                System.out.println("key:"+key + "; value :"+ value);                                //输出key和value
            }

        以上两种方式的输出结果都为:

    key:null; value :ainiyou
    key:1001; value :zhangsan
    key:1003; value :lisi
    key:1004; value :houqi

      创建一个自定义类Book,使用上述方法进行输出,请见下方代码:

    import java.util.*;
    public class MapBookTest {
    
        public static void main(String[] args) {
            Map<Book, String> bookMap = new HashMap<Book, String>();
            bookMap.put(new Book(50, "1明朝那些事"), "京东");
            bookMap.put(new Book(39, "2解忧杂货店"), "天猫");
            bookMap.put(new Book(48, "3白夜行"), "当当网");
            bookMap.put(new Book(59, "4官场笔记"), "亚马逊");
            bookMap.put(new Book(48, "5白夜行"), "当当网");
            //entrySet方法
            Set<Map.Entry<Book, String>> entrySet = bookMap.entrySet();
            for(Iterator<Map.Entry<Book, String>> it = entrySet.iterator(); it.hasNext();){
                Map.Entry<Book, String> entry = it.next();
                Book key = entry.getKey();
                String value = entry.getValue();
                System.out.println(key + ",购买自"+value);
            }
            //keySet方法
            Set<Book> sb = bookMap.keySet();
            for(Iterator<Book> it = sb.iterator(); it.hasNext();){
                Book key = it.next();
                String value = bookMap.get(key);
                System.out.println(key + ",购买自"+value);
            }
        }
    }
    //实现接口让其具备比较性
    class Book implements Comparable<Book>{
        
        private String name;
        private Integer price;
        
        public Book(Integer price,String name) {
            super();
            this.name = name;
            this.price = price;
        }
        public void setPrice(Integer price){
            this.price = price;
        }
        public int getPrice(){
            return price;
        }
        public void setName(String name){
            this.name = name;
        }
        public String getName(){
            return name;
        }
        public String toString(){
            return name + "的价格为:"+price;
        }
        
        //复写hashCode
        public int hashCode(){
            final int prime = 31;
            int result = 1;
            result = prime * result + price;
            result = prime * result +name.hashCode()*result;
            return result;
        }
        
        //复写equals
        public boolean equals(Object obj){
            if(!(obj instanceof Book)){
                throw new ClassCastException("请确认格式");
            }
            Book book = (Book)obj;
            return book.name.equals(this.name) && book.price == this.price;
        }
        //复写比较器
        public int compareTo(Book b){
            int num = new Integer(this.price).compareTo(new Integer(b.price));
            if(num == 0){
                return this.name.compareTo(b.name);
            }
            return num;
        }
    }

    因为HashMap是无序的,想要排序可将HashMap改为TreeMap,即可实现排序功能。如下方代码,以价格进行排序:

    Map<Book, String> bookMap = new TreeMap<Book, String>();
            bookMap.put(new Book(50, "明朝那些事"), "京东");
            bookMap.put(new Book(39, "解忧杂货店"), "天猫");
            bookMap.put(new Book(48, "白夜行"), "当当网");
            bookMap.put(new Book(59, "官场笔记"), "亚马逊");
            bookMap.put(new Book(48, "白夜行"), "当当网");
            //entrySet方法
            Set<Map.Entry<Book, String>> entrySet = bookMap.entrySet();
            for(Iterator<Map.Entry<Book, String>> it = entrySet.iterator(); it.hasNext();){
                Map.Entry<Book, String> entry = it.next();
                Book key = entry.getKey();
                String value = entry.getValue();
                System.out.println(key + ",购买自"+value);
            }

    输出结果为:

    解忧杂货店的价格为:39,购买自天猫
    白夜行的价格为:48,购买自当当网
    明朝那些事的价格为:50,购买自京东
    官场笔记的价格为:59,购买自亚马逊
  • 相关阅读:
    MyEclipse 常用快捷键
    javaEE基础08
    MySql卸载重新安装出现Start service没有响应的解决办法(64位)
    javaSE基础07
    为WAMP中的mysql设置密码(默认为空)
    javaSE基础06
    javaSE基础05
    vue框架构建项目流程
    阿里云或本地部署服务器(一)---nginx本地和服务器代理
    修改vue element Transfer 穿梭框里内容区的宽度
  • 原文地址:https://www.cnblogs.com/yjboke/p/8805572.html
Copyright © 2011-2022 走看看