从 TreeMap 返回相邻键

Returning adjacent keys from a TreeMap

给出以下 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)}};

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

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

TreeMapNavigableMap.

NavigableMap 接口提供了检索相邻键(和条目)的方法。

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

比较键

二读,你好像没有钥匙。您有一个值要与地图中的键进行比较。

在这种情况下,获取映射中所有键的 SetNavigableMap 扩展 SortedMap。所以我们可以调用SortedMap::keySet。返回的集合按排序顺序迭代。

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

创建一个 List,通过索引访问单个元素。

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

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

NavigableMap::floorKey/ceilingKey

或者,如 ,我们可以要求 NavigableMap 比较键值以获得最接近的匹配。

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

示例代码

制作输入图。我们使用 Map.of initially for its convenient literal syntax. Then we feed that un-modifiable map to the constructor 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

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


备注:

  • 一样,您的双支撑初始化有些 hack。考虑到本答案中显示的新 List.of 文字语法,现在不需要了。
  • 如果你关心 accuracy, use BigDecimal rather than Double.