我想请求帮助。让我们说我的HashMap的键值如下:
String1 0.99
String2 0.98
String3 0.97
String4 0.98
String5 0.5
String6 0.4
String7 0.3
etc.
我想通过以下公式将前15个条目保存到数组:Math.abs(value - 0.5).
此数据的计算值(按公式计算)为:
String1 0.49
String2 0.48
String3 0.47
String4 0.48
String5 0
String6 0.1
String7 0.2
值排序
String1 0.49
String4 0.48
String2 0.48
String3 0.47
String7 0.2
String6 0.1
String5 0
现在我想要数组,其中index是顺序并且值为原始值,如下所示:
array[0] = 0.99
array[1] = 0.98
array[2] = 0.98
array[3] = 0.97
array[4] = 0.3
array[5] = 0.4
array[6] = 0.5
感谢大家的帮助
任何帮助将不胜感激。谢谢
答案 0 :(得分:1)
第一个选项是迭代整个地图并找到你的值 - 也许把它扔进一个数组并使用O(n * log n)排序算法或15 * O(n)遍历它。
你可以放弃钥匙唯一的条件吗?然后使用有序对(String,float)并编写一个在" float"上实现规则的客户p
。值,并使用Comparator
。
可能有一个涉及SortedSet
的解决方案,我不确定。
答案 1 :(得分:1)
您可以使用Java 8流API:
List<Double> result = map.values().stream()
.map(value -> Math.abs(value - 0.5))
.sorted()
.limit(15)
.collect(toList());
答案 2 :(得分:0)
行。所以你有一张地图,但你只关心它的价值观。因此,让我们从地图中获取值开始:
map.values()
然后您想要对这些值进行排序。所以你需要一个比较器。该比较器应按Math.abs(value - 0.5)
Comparator<Float> comparator =
Comparator.comparing((Float value) -> Math.abs(value - 0.5F));
但是导致最大差异的价值应该是第一个,而不是最后一个。所以让我们改变比较器:
Comparator<Float> comparator =
Comparator.comparing((Float value) -> Math.abs(value - 0.5F))
.reversed();
现在你需要应用那个比较器,并且只取15个第一个值:
Comparator<Float> comparator =
Comparator.comparing((Float value) -> Math.abs(value - 0.5F))
.reversed();
List<Float> top15 = map.values()
.stream()
.sorted(comparator)
.limit(15)
.collect(Collectors.toList());
或者,如果你真的想要一个数组而不是List:
Float[] top15 = map.values()
.stream()
.sorted(comparator)
.limit(15)
.toArray(Float[]::new);