gpt4 book ai didi

java - java获取所有Top N排名记录

转载 作者:行者123 更新时间:2023-12-02 02:46:04 26 4
gpt4 key购买 nike

我有一个如下所示的 HashMap 结果数据

"zip000", 1234
"zip001", 2345
"zip002", 3456
"zip003", 4567
"zip004", 7890
"zip005", 7890
"zip006", 123
"zip007", 234
"zip010", 7890
"zip011", 678
"zip012", 789
"zip013", 890

并使用下面的代码

  public static List<String> topNKeys(final HashMap<String, Integer> map, int n) {
PriorityQueue<String> topN = new PriorityQueue<String>(n, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(map.get(s1), map.get(s2));
}
});

for(String key:map.keySet()){
if (topN.size() < n)
topN.add(key);
else if (map.get(topN.peek()) < map.get(key)) {
topN.poll();
topN.add(key);
}
}
return (List) Arrays.asList(topN.toArray());
}

上面的代码将 topN 记录显示为

假设 n= 6

zip001=2345
zip002=3456
zip003=4567
zip005=7890
zip010=7890
zip004=7890

但我需要它根据整数排名给出所有前 6 个结果数据,我的意思是如下

zip013=890
zip000=1234
zip001=2345
zip002=3456
zip003=4567
zip005=7890
zip010=7890
zip004=7890

按照整数,其中7890,4567,3456,2345,1234,890是前5个整数。

我怎样才能做到这一点?感谢任何形式的帮助和建议。

最佳答案

您可以分两步完成:

  1. 收集不同的前 N ​​个数字
  2. 收集所有具有前 N 个值的条目

在代码方面,你可以这样写:

public static List<Entry<String, Integer>> topNKeys(Map<String, Integer> map, int n) {
Set<Integer> topValues = getTopValues(map, n);
return getEntriesWithTopValues(map, topValues);
}

//Returns the distinct top n values
private static Set<Integer> getTopValues(Map<String, Integer> map, int n) {
TreeSet<Integer> values = new TreeSet<>(map.values());
Set<Integer> topNValues = new HashSet<>();
for (int i = 0; i < n; i++) {
Integer v = values.pollLast();
if (v != null) topNValues.add(v);
else break;
}
return topNValues;
}

//Returns the entries with a value that is contained in topValues
private static List<Entry<String, Integer>> getEntriesWithTopValues(Map<String, Integer> map, Set<Integer> topValues) {
return map.entrySet().stream()
.filter(e -> topValues.contains(e.getValue()))
.sorted(Entry.comparingByValue())
.collect(toList());
}

应用于您的示例,它会返回所需的输出。

如果没有流,最后一个方法可以这样写:

private static List<Entry<String, Integer>> getEntriesWithTopValues(Map<String, Integer> map, Set<Integer> topValues) {
List<Entry<String, Integer>> result = new ArrayList<> ();
for (Entry<String, Integer> e : map.entrySet()) {
if (topValues.contains(e.getValue())) result.add(e);
}

Collections.sort(result, new Comparator<Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> e1, Entry<String, Integer> e2) {
return e1.getValue().compareTo(e2.getValue());
}
});

return result;
}

关于java - java获取所有Top N排名记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44562314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com