给定以下内容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
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 )`
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
ceilingKey
制作输入地图。我们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
笔记:
List.of
此答案中显示的新的文字语法,现在不再需要。BigDecimal
而不是Double
。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句