Например, если у меня карта состоит из {"A", 0.0}, {"B", 3.14}, {"C", 3.14}, {"D", 8.8}, {"E", 2.1}, {"F", 1.01}
, а верхние 3 клавиши будут {"D", "B", "C"}
.
Мне известен процедурный способ сделать это, но есть ли более умный / функциональный способ сделать это в Java 8?
Редактировать: обратите внимание, что мы можем поместить каждый элемент карты в приоритетную очередь размера N, поэтому временная сложность должна составлять M log (N), быстрее, чем сортировка всех M элементов, которая равна M журнал (M).
Редактировать 2: По запросу, это то, что у меня есть:
public static void main(String args[]) {
final Map<String, Double> map = new HashMap<String, Double>() {{
put("A", 0.0);
put("B", 3.14);
put("C", 3.14);
put("D", 8.8);
put("E", 2.1);
put("F", 1.01);
}};
System.out.println("answer= " + getTopN(map, 3).toString());
}
static List<String> getTopN(final Map<String, Double> map, int n) {
// Creating priority queue with limit size n
PriorityQueue<Entry<String, Double>> pq = new PriorityQueue<>(n, Entry.comparingByValue());
for (Entry<String, Double> entry : map.entrySet()) {
pq.add(entry);
if (pq.size() > n) {
pq.poll();
}
}
Stack<String> stack = new Stack<>();
while (!pq.isEmpty()) {
stack.add(pq.poll().getKey());
}
final ArrayList<String> answer = new ArrayList<>();
while (!stack.isEmpty() && n-- > 0) {
answer.add(stack.pop());
}
return answer;
}