Map的computeIfAbsent的使用场景和使用方法

Map的computeIfAbsent的使用场景和使用方法

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
    ...
}

我们在复杂map操作(put操作)时候有的时候不知道此时当前key对应的value值是否存在,这里,我们如果使用常规的代码编写,代码量比较大

例如我们定义一个场景:存在一个数组,我们需要将当前数组中相同的数存储到一个对应List集合中

常规实现:

    @Test
    public void test02() {
        //复杂map的使用场景:首先我们说复杂map,即map的value值为一个list集合或者是一个Set集合,对象或者是其他的集合
        //给定一个场景:现在存在一个数组,我们需要将当前数组中相同的数存储到一个对应List集合中
        int[] nums = {1,2,3,1,3,4,6,7,9,9,1,3,4,5};
        Map<Integer, List<Integer>> map = new HashMap<>();
        //普通的写法
        for (int i = 0; i < nums.length; i++) {
            if (!map.containsKey(nums[i])) {
                ArrayList<Integer> list = new ArrayList<>();
                list.add(nums[i]);
                map.put(nums[i],list);
            }else {
                map.get(nums[i]).add(nums[i]);
            }
        }
        map.forEach((key,value) -> {
            System.out.print(key + ": ");
            System.out.println(value);
        });
    }

使用computeIfAbsent方法实现:

    @Test
    public void  test03() {
        int[] nums = {1,2,3,1,3,4,6,7,9,9,1,3,4,5};
        Map<Integer, List<Integer>> map = new HashMap<>();
        //我们使用map的computeIfAbsent解决
        for (int i = 0; i < nums.length; i++) {
            //返回值是该key对应的集合list
            map.computeIfAbsent(nums[i], key -> new ArrayList<Integer>());
            map.get(nums[i]).add(nums[i]);
        }
    
        map.forEach((key,value) -> {
            System.out.print(key + ": ");
            System.out.println(value);
        });
    }

输出结果:

1: [1, 1, 1]
2: [2]
3: [3, 3, 3]
4: [4, 4]
5: [5]
6: [6]
7: [7]
9: [9, 9]
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
map和unordered_map是C++标准库中的两种关联容器,它们的使用场景有所不同。 map底层使用红黑树结构,保证了元素的有序性。因此,在需要元素有序性或对单次查询性能要求较高时,可以使用map。例如,需要按照键的自然顺序进行遍历、查询或者需要在有序的键序列中进行范围查找等情况下,map是一个不错的选择。 unordered_map底层使用哈希结构,它不保证元素的有序性,但对于查找性能来说更高效。因此,在不需要元素有序性或对单次查询性能要求不那么敏感的场景下,可以使用unordered_map。例如,需要快速的元素查找、插入和删除操作时,unordered_map会更适合。 总结来说,在需要元素有序性或对单次查询性能要求较高的情况下,可以使用map。而在不需要元素有序性或对单次查询性能要求不那么敏感的情况下,可以使用unordered_map。在算法编程的大部分情况下,更倾向于使用unordered_map而不是map。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [浅谈map和unordered_map的应用场景](https://blog.csdn.net/wtl666_6/article/details/128532718)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++小知识——map和unordered_map区别](https://blog.csdn.net/qq_45890970/article/details/123955261)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值