• Java容器使用:Map


    1.题目说明

    2.思路分析

    题目的意思也就是说,要在数组第 j 个元素前的几个元素里找到与其差的绝对值最小的元素,返回其差值以及下标。

    那显然,差的绝对值最小无非两种情况,一个是大于该元素的最小元素,一个是小于该元素的最大元素,那我们很自然的就想到TreeMap里的两个函数:ceilingEntry(key)和floorEntry(key)。他们分别可以返回大于等于key的最小元素以及小于等于key的最大元素。

    那么,最小差值就是(key - 小于等于key的最大元素),或者是(大于等于key的最小元素 - key)

    具体取哪个值需要比较一下,谁更小就取谁,而位置则是存在了TreeMap的value里,直接调用getValue()即可。

    3.代码实现

    1. import java.util.Map;
    2. import java.util.Scanner;
    3. import java.util.TreeMap;
    4. public class Main {
    5. public static void main(String[] args){
    6. Scanner in = new Scanner(System.in);
    7. TreeMap x = new TreeMap<>();
    8. int n = in.nextInt();
    9. int[] a = new int[n];
    10. for(int i = 0; i < n;i++)
    11. a[i] = in.nextInt();
    12. x.put(a[0],0);//map里不能没有东西,因为需要比较,相当于初始化。
    13. for(int i = 1;i < n;i++){
    14. Map.Entry up = x.ceilingEntry(a[i]);
    15. Map.Entry down = x.floorEntry(a[i]);//注意:map的对象类型是map.entry。
    16. int pos = -1,minus = Integer.MAX_VALUE;//把minus设成极大是因为防止在up为null时,minus过小而导致第二个if直接为false
    17. if(up != null){
    18. minus = up.getKey() - a[i];
    19. pos = up.getValue();
    20. }
    21. if(down != null && (a[i] - down.getKey() <= minus)){
    22. minus = a[i] - down.getKey();
    23. pos = down.getValue();
    24. }//判定条件里要与minus作比较,可能是初始设定的极大值,也有可能是up不等于null判定完算出来的up.getkey() - a[i].
    25. System.out.println(minus + " " + (pos + 1));
    26. x.put(a[i] , i);//需要将这一对加到map里进行后续的操作。
    27. }
    28. }
    29. }

    虽然题简单,但涉及到的一些细节需要好好考虑,如将minus的初值设定为int型所能存的最大数值。

    4.对于Map的理解

    Map存的是一个二元组,可以理解成数学上的映射,即每个key都对应一个value。那它所能处理的东西就不是简简单单的一个数据了。它存的是数据以及数据之间的关系。最经典的例子莫过于这道题里的数组元素及其下标,原来做的题里还有目标数字在数组中出现的次数,也可以用Map来存。

    Map更偏向于存的是一对有关系的数据。

    5.Map里的一些常用函数

    1. 接口:java.util.Map
    2. 实现:
    3. java.util.HashMap:哈希表
    4. java.util.TreeMap:平衡树
    5. 函数:
    6. put(key, value):添加关键字和其对应的值
    7. get(key):返回关键字对应的值
    8. containsKey(key):是否包含关键字
    9. remove(key):删除关键字
    10. size():返回元素数
    11. isEmpty():是否为空
    12. clear():清空
    13. entrySet():获取Map中的所有对象的集合
    14. Map.Entry:Map中的对象类型
    15. getKey():获取关键字
    16. getValue():获取值
    17. java.util.TreeMap多的函数:
    18. ceilingEntry(key):返回大于等于key的最小元素,不存在则返回null
    19. floorEntry(key):返回小于等于key的最大元素,不存在则返回null

  • 相关阅读:
    如何快速从 ETL 到 ELT?火山引擎 ByteHouse 做了这三件事
    Linux权限管理
    pgbench 性能测试工具的使用
    Chapter9.2:线性系统的状态空间分析与综合(下)
    使用 FastAPI 实现服务端的 CRUD
    输入网址后发生了什么&没有listen(accept)能建立连接吗&SYN洪水
    基于SSM+Vue的医院住院综合服务管理系统的设计与实现
    什么是工作流引擎
    传统项目管理与敏捷项目管理
    从0搭建前端脚手架详解(小白也可以搭建)
  • 原文地址:https://blog.csdn.net/Dispance/article/details/132651659