Map-map.getOrDefault()用法

前言:

我之所以会认识到它,是因为在做一道leetcode题的时候发现如果想在每个数据上进行累加我必须先给每个key赋初值才行 (如果不赋初值在计算一开始就会报空指针异常) ,但这显得十分麻烦代码看起来十分冗余并让程序执行效率降低,于是后来在看了其他人的题解过程中无意发现了这个方法,经过查阅后发现map可以直接赋初值并计算。也就是该文所要讲述的map.getOrDefault().

API展示:

在这里插入图片描述

我的理解:

Map.getOrDefault(Object key, V defaultValue)方法的作用是:
  (1)当Map集合中存在这个key时,就使用这个key值,(若是数值型可以在此基础上进行运算)
  (2)如果没有就使用默认值defaultValue

用途:

代码演示1(使用前):

		String t="ABC"
		char ch[] = t.toCharArray();
        List<Character> list = new ArrayList<>();
        //将A中的每个值传入list
        //我是为了后面做题才这么写的,当时想的有点复杂
        for (int k = 0; k < t.length; k++) {
            list.add(ch[k]);
        }
		//-------------正式开始-------------
		HashMap<Character, Integer> map = new HashMap();
		//先将每个key的value赋值为0,因为不赋初值直接计算会报该空指针异常
        for (int k = 0; k < lists.size(); k++) {
            map.put(list.get(k), 0);
        }
   		//逐个进行计算
        for (int k = 0; k < lists.size(); k++) {
            map.put(list.get(k), map1.get(list.get(k)) + 1);
        }

代码演示2(使用后):

	   String t="ABC"
       Map<Character, Integer> map = new HashMap<>();
       //遍历字符串 t,初始化每个字母的次数
       for (int i = 0; i < t.length(); i++) {
           char chat= t.charAt(i);
           map.put(chat, map.getOrDefault(chat, 0) + 1);
       }

总结:

很明显可以看出我和大佬之间思维的差距,我的明显麻烦很多,所以我觉得这个方法确实帮助到了我所以做下笔记来记载下吧,若有什么不对还请大家指出,谢谢!!

力扣实战:

  1. 最小覆盖子串(滑动窗口)
    链接:https://leetcode-cn.com/problems/minimum-window-substring/
class Solution {
    public String minWindow(String s, String t) { 
    Map<Character, Integer> map = new HashMap<>();
    //遍历字符串 t,初始化每个字母的次数
    for (int i = 0; i < t.length(); i++) {
        char char_i = t.charAt(i);
        map.put(char_i, map.getOrDefault(char_i, 0) + 1);
    }
    int left = 0; //左指针
    int right = 0; //右指针
    int ans_left = 0; //保存最小窗口的左边界
    int ans_right = -1; //保存最小窗口的右边界
    int ans_len = Integer.MAX_VALUE; //当前最小窗口的长度
    //遍历字符串 s
    while (right < s.length()) {
        char char_right = s.charAt(right);
        //判断 map 中是否含有当前字母
        if (map.containsKey(char_right)) {
            //当前的字母次数减一
            map.put(char_right, map.get(char_right) - 1);
            //开始移动左指针,减小窗口
            while (match(map)) { //如果当前窗口包含所有字母,就进入循环
                //当前窗口大小
                int temp_len = right - left + 1;
                //如果当前窗口更小,则更新相应变量
                if (temp_len < ans_len) {
                    ans_left = left;
                    ans_right = right;
                    ans_len = temp_len;
                }
                //得到左指针的字母
                char key = s.charAt(left);
                //判断 map 中是否有当前字母
                if (map.containsKey(key)) {
                    //因为要把当前字母移除,所有相应次数要加 1
                    map.put(key, map.get(key) + 1);
                }
                left++; //左指针右移
            }
        }
        //右指针右移扩大窗口
        right++;
    }
    return s.substring(ans_left, ans_right+1);
}

    //判断所有的 value 是否为 0
    private boolean match(Map<Character, Integer> map) {
        for (Integer value : map.values()) {
            if (value > 0) {
                return false;
            }
        }
        return true;
    }
}

持续更新中…

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值