【问题标题】:Returning adjacent keys from a TreeMap从 TreeMap 返回相邻键
【发布时间】:2020-07-15 16:52:46
【问题描述】:

鉴于以下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

【问题讨论】:

  • 看看lowerEntry()higherEntry() 以及简单的for循环
  • headMap()tailMap()。查看NavigableMap API,有很多选择。
  • 使NavigableMap 的扩展方法工作的关键部分是将String 数据(例如,“53.4”)转换为Double 实例。您的代码没有说明这一点。您能否提供您实际的、可编译的代码,以便我们帮助解决那里的任何问题?顺便说一句,你在这里使用double-brace initialization,我强烈反对。
  • 双关语不是故意的。

标签: java dictionary treemap


【解决方案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

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

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

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

示例代码

制作输入地图。我们最初使用Map.of 是因为它方便的文字语法。然后我们将un-modifiable map 提供给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 下一个更高 = 59.4

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


注意事项:


【讨论】:

  • 我感谢(并且赞成)的帮助。我使用的是lowerkey和higherkey,但看起来有点笨拙。我喜欢 SortedMap 解决方案。
  • 您可以调用ceilingKey(K key)floorKey(K key) 来获取最接近任何给定起点的键,而不是循环遍历键集来比较键。
  • @dnault 谢谢你的提示。这样就可以进行流畅的简单编码。
  • 我最终使用了这种循环形式的变体。我试图找到低于和高于给定插值值的 n 个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多