从TreeMap返回相邻键

user1524459:

给定以下内容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)}};

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

罗勒·布尔克(Basil Bourque):

tl; dr

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 )`

看到此代码在IdeOne.com上实时运行

57.1

NavigableMap::lowerKey/higherKey

TreeMap是一个NavigableMap

NavigableMap界面提供了用于检索相邻键(和条目)的方法。

重复命令以获取所需的任意多个相邻键,直到收到null

比较键

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

在这种情况下,获取Set映射中所有键的a NavigableMap延伸SortedMap这样我们可以打电话给SortedMap::keySet返回的集合按排序顺序进行迭代。

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

List的是,通过索引来访问单个元素。

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

现在,您可以循环排序列表以比较值。

NavigableMap::floorKey/ceilingKey

或者,如dnault所说,我们可以要求NavigableMap比较比较关键值以获取最接近的匹配项。

  • floorKey
    返回小于或等于给定键的最大键;如果没有这样的键,则返回null。
  • ceilingKey
    返回大于或等于给定键的最小键;如果没有这样的键,则返回null。

范例程式码

制作输入地图。我们Map.of最初使用它的方便的文字语法。然后,我们将该不可修改的映射提供给的构造函数TreeMap我们在这里看到的文字输入碰巧是经过排序的,但这是不相关的,因为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

看到此代码在IdeOne.com上实时运行。


笔记:


Java 11中的地图实现表,比较它们的功能

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章