zoukankan      html  css  js  c++  java
  • Java 集合框架之 Map

    1. Map 集合特点:

      • Map 集合一次添加一对元素, Collection 一次添加一个元素
      • Map 集合中存储的是键值对(类似夫妻), Map 集合必须保证键的唯一性
      • Map 称为双列集合, Collection 称为单列集合
    2. 常用方法:

    // 1. 添加
        value put(key,value); // 返回前一个与 key 关联的值, 如果没有, 返回 null
    
    // 2. 删除
        void clear(); // 清空 Map() 集合
        value remove(key); // 根据指定 key 删除这个键值对, 改变集合长度
    
    // 3. 判断
        boolean containsKey(key);
        boolean containsValue(value);
        boolean isEmpty();
    
    // 4. 获取
        int size(); // 获取键值对的个数
        value get(key); // 通过键获取值, 如果没有该键,返回 null
    
    1. 取出 Map 集合中所有元素
    // 第一种方式:
    /*
    1. 通过 keySet() 方法获取 Map 集合中所有的键所在的 Set 集合,
    2. 通过 Set 的迭代器获取到每一个键
    3. 对每一个键通过 Map 集合的 get(key) 方法获取对应的值
    */
    
    public static void main(String[] args){
        Map<Integer, String> map = new HashMap();
    
        map.put(3,"wangcai");
        map.put(7,"xiaoqiang");
        map.put(9,"zhaoliu");
        map.put(2,"lisi");
    
        // 获取 Set 集合
        Set<Integer> keySet = map.keySet();
        Iterator<Integer> it = keySet.iterator();
        while(it.hasNext()){
            Integer key = it.next();
            String value = map.get(key);
    
            System.out.println(key+"..."+value);
        }
    }
    
    // 第二种方式: 通过 entrySet() 方法
    // 该方法将键和值的映射关系作为对象存储到了 Set 集合中,
    // 而这个映射关系的类型就是 Map.Entry 类型(这个映射关系即结婚证)
    
    public static void main(String[] args){
        Map<Integer, String> map = new HashMap();
    
        map.put(3,"wangcai");
        map.put(7,"xiaoqiang");
        map.put(9,"zhaoliu");
        map.put(2,"lisi");
    
        Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
    
        Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
        while(it.hasNext()){
            Map.Entry<Integer, String> me = it.next(); // Map.Entry<Integer, String> 表示类型
            Integer key = me.getKey();
            String value = me.getValue();
    
            System.out.println(key+":::"+value);
        }
    }
    
    // Map.Entry 备注: 内部类. 例如:
    
    Outer.Inner.show();
    
     class Outer{
        static class Inner{
            static void show();
    }
    }
    
    // 备注二: 因为 Map 中键是唯一的, 所以使用 Set 集合存储所有的键.
    

    3.1 特例: 仅获取 Map 集合中所有的值

    public static void main(String[] args){
        Map<Integer, String> map = new HashMap();
    
        map.put(3,"wangcai");
        map.put(7,"xiaoqiang");
        map.put(9,"zhaoliu");
        map.put(2,"lisi");
    
        Collection<String> values = map.values();
    
        Iterator<String> it = values.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
    
    //备注: 因为 Map 集合中键所对应的值并不一定是唯一的, 所以 values() 方法返回值类型为 Collection
    
    1. Map 集合常见子类对象(请参照Set集合)

      • Hashtable : 内部结构是哈希表,是同步的. 不允许 null 作为键, null 作为值
        • Properties : 用来存储键值对型的配置信息, 可以和 IO 技术相结合
      • HashMap : 内部结构是哈希表,不是同步的. 允许 null 作为键, null 作为值
        • LinkedHashMap : 保证存入和取出的顺序一致
      • TreeMap : 内部结构是二叉树,不是同步的, 可以对 Map 集合中的键进行排序
    2. 练习

    // "fdgavcbsacdfs" 获取该字符串中, 每一个字母出现的次数
    // 要求打印结果是: a(2)b(1)....;
    
    /*
    思路:
    对结果的分析发现,字母和次数之间存在着映射关系, 而且这种关系很多
    很多就需要存储, 能存储映射关系的容器有数组和 Map 集合
    关系的中的一方是有序编号吗? 不是!
    那就使用 Map 集合. 又发现可以保证唯一性的一方具备着顺序如, a, b, c...
    所以使用 TreeMap 集合
    
    这个集合最终应该存储的是字母和次数的对应关系
    
    步骤:
    1. 因为操作的是字符串中的字母, 所以先将字符串变成字符数组
    2. 遍历字符数组,用每一个字母作为键去 Map 集合中查询,
    如果该字母键不存在, 就将该字母作为键作为值存储到 Map 集合中
    如果该字母键存在, 就将该字母键对应的值取出并 +1, 再将该字母和 +1 后的值存储到 Map 集合中
    键相同,值会覆盖. 这样就记录住了该字母出现的次数
    3. 遍历结束, Map 集合就记录了所有字母出现的次数
    */
    
    public class MapTest {
        public static void main(String[] args){
    
            String str = "fdgavc   +++ ==== $ %#  bsacdfs";
    
            String s = getCharCount(str);
    
            System.out.println(s);
        }
    
        public static String getCharCount(String str){
    
            // 将字符串变成字符数组
            char[] chs = str.toCharArray();
    
            // 定义 Map 集合表
            Map<Charater, Integer> map = new TreeMap<Charater, Integer>();
    
            for(int i = 0; i<chs.length; i++){
    
                // 将非字母的字符去掉
                if(!(chs[i] >= 'a' && chs[i] <= 'z' || chs[i] >= 'A' && chs[i] <= 'Z'))
                    continue;
    
                // 将数组中的字母作为键去查 Map 表
                Integer value = map.get(chs[i]);
    
                // 判断值是否为 null
                // 第一种方式:
                if(value == null){
                    map.put(chs[i], 1);
                } else {
                    map.put(chs[i], value+1);
                }
    
                // 第二种方式
                int count = 0; // 计数器
                if(value != null){
                    count = value;
                }
                count++;
                map.put(chs[i], count);
            }
            return mapToString(map);
        }
    
        private static String mapToString(Map<Charater, Integer> map) {
    
            // 使用 StringBuilder 存储字符串
            StringBuilder sb = new StringBuilder();
    
            Iterator<Charater> it = map.keySet().iterator();
            while(it.hasNext()){
                Charater key = it.next();
                Integer value = map.get(key);
    
                sb.append(key+"("+value+")");
            }
            return sb.toString();
        }
    }
    


    _参考资料_ - [JavaSE 基础视频(毕向东)](https://www.bilibili.com/video/av3120256/#page=1) - [JDK 1.6 中文文档](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh)
  • 相关阅读:
    2017-2018-1 20155232 20155215《信息安全技术》实验四—— 木马及远程控制技术
    ## 2017-2018-1 20155232 实验三 实时系统
    # 2017-2018-1 20155232 《信息安全系统设计基础》第九周学习总结
    linux pwd指令C实现
    2017-2018-1 20155232 《信息安全系统设计基础》第八周学习总结以及课下补做
    2017-2018-1 20155232 《信息安全系统设计基础》第七周学习总结
    2017-2018-1 20155232 20155215 实验二 固件程序设计
    # 2017-2018-1 20155232 《信息安全系统设计基础》第六周学习总结
    # 2017-2018-1 20155232《信息安全技术》实验二——Windows口令破解
    # 2017-2018-1 20155232 《信息安全系统设计基础》第五周学习总结
  • 原文地址:https://www.cnblogs.com/linkworld/p/7496753.html
Copyright © 2011-2022 走看看