import java.util.*; class Pair { public final K key; public final V value; public Pair(K key, V value) { this.key = key; this.value = value; } } public class TopElements { private final TreeMap> elemListMap = new TreeMap>(Collections.reverseOrder()); private final int maxElems; private int numElems = 0; TopElements(int maxNumberElements) { maxElems = maxNumberElements; } public void put(Integer key, V value) { if (numElems < maxElems || key >= elemListMap.lastKey()) { if (!elemListMap.containsKey(key)) elemListMap.put(key, new ArrayList()); elemListMap.get(key).add(value); numElems = numElems + 1; } int lastBucketSize = elemListMap.get(elemListMap.lastKey()).size(); if (numElems - lastBucketSize >= maxElems) { elemListMap.remove(elemListMap.lastKey()); numElems = numElems - lastBucketSize; } } public List> getAll() { List>elems = new ArrayList>(); for (Map.Entry> elemList : elemListMap.entrySet()) for (V value : elemList.getValue()) elems.add(new Pair(elemList.getKey(), value)); return elems; } public static void main(String[] args) { TopElements islands = new TopElements(3); islands.put( 507000, "Baffin"); islands.put( 726000, "Borneo"); islands.put(2131000, "Greenland"); islands.put( 578000, "Madagascar"); islands.put( 800000, "New Guinea"); System.out.println("Three Largest Islands:"); for (Pair island : islands.getAll()) System.out.println(island.key + " sq km - " + island.value); } }