Java - 按规则从HashMap获得前15名

时间:2015-12-11 22:24:08

标签: java sorting hashmap

我想请求帮助。让我们说我的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 

感谢大家的帮助

任何帮助将不胜感激。谢谢

3 个答案:

答案 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);