有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从树映射返回相邻键

鉴于以下情况TreeMap

Map<Double, Integer> treeMap = new TreeMap<Double, Integer>() {{. 
        put("52.1", 1);
        put("53.4", 2); 
        put("57.1", 3); 
        put("59.4", 7); 
        put("60.2", 11); 
        put("71.6", 16)}};

对于给定的双精度,返回最接近的n个匹配项(在两个方向上)的最佳方法是什么?例如,n=2和“58.0”将返回53.4、57.1、59.4和60.2


共 (1) 个答案

  1. # 1 楼答案

    tl;博士

    new TreeMap <>(
            Map.of(
                    52.1d , 1 ,
                    53.4d , 2 ,
                    57.1d , 3 ,
                    59.4d , 7 ,
                    60.2d , 11 ,
                    71.6d , 16
            )
    )
    .floorKey( 58.0d )     // Or call `.ceilingKey( 58.0d )`
    

    看这个code run live at IdeOne.com

    57.1

    NavigableMap::lowerKey/higherKey

    ^{}是一个NavigableMap

    {a3}接口提供了检索相邻键(和条目)的方法

    重复这些命令以获取所需数量的相邻键,直到收到null

    比较键

    二读时,你似乎没有钥匙。有一个值要与地图中的关键点进行比较

    在本例中,获取映射中所有键的SetNavigableMap扩展SortedMap。所以我们可以叫^{}。返回的集合按排序顺序迭代

    Set< Double > set = map.keySet() ;
    

    对其进行List,通过索引访问单个元素

    List< Double > doublesListSorted = List.of( set.toArray() ) ;  // Get un-modifiable list.
    

    现在可以循环排序列表来比较值

    NavigableMap::floorKey/ceilingKey

    或者,作为dnault commented,我们可以要求NavigableMap比较最接近匹配的键值

    • ^{}
      返回小于或等于给定密钥的最大密钥,如果没有这样的密钥,则返回null
    • ^{}
      返回大于或等于给定密钥的最小密钥,如果没有这样的密钥,则返回null

    示例代码

    制作一个输入地图。我们最初使用^{}是因为它的文字语法很方便。然后我们将un-modifiable map馈送给^{}的构造函数。我们在这里看到的文字输入碰巧是经过排序的,但这与此无关,因为TreeMap构造函数将按键对条目进行排序

    NavigableMap < Double, Integer > map =
            new TreeMap <>(
                    Map.of(
                            52.1d , 1 ,
                            53.4d , 2 ,
                            57.1d , 3 ,
                            59.4d , 7 ,
                            60.2d , 11 ,
                            71.6d , 16
                    )
            );
    

    map.toString(): {52.1=1, 53.4=2, 57.1=3, 59.4=7, 60.2=11, 71.6=16}

    设定我们希望最接近的目标

    Double target = 58.0d;
    

    获取相邻的关键点,下一个较低,下一个较高

    Double nextLower = map.floorKey( target );
    Double nextHigher = map.ceilingKey( target );
    

    nextLower = 57.1 nextHigher = 59.4

    看到这个code run live at IdeOne.com.


    注:

    • 作为commented by erickson你的双括号初始化有点像黑客。考虑到这个答案中显示的新的List.of文本语法,现在不需要了
    • 如果你关心accuracy,使用^{}而不是^{}

    Table of map implementations in Java 11, comparing their features