2011-04-13 47 views
10

鑑於這種地圖如何在Java TreeMap中選擇前N個項目?

SortedMap<Integer, String> myMap = new TreeMap<Integer, String>(); 

而不是一個for循環是有一個實用功能,前n項複製到目的地地圖?

+0

我還沒有檢查,但我不會感到驚訝,如果一些谷歌的Java API有一個班輪只是爲了:) – SyntaxT3rr0r 2011-04-13 11:59:06

回答

5

也許,但不是作爲標準Java API的一部分。並且:該實用程序將在內部使用循環。

所以你需要一個循環,但是你可以通過在一個工具類做的一切都是在一個靜態方法創建自己的「工具」:

public static SortedMap<K,V> putFirstEntries(int max, SortedMap<K,V> source) { 
    int count = 0; 
    TreeMap<K,V> target = new TreeMap<K,V>(); 
    for (Map.Entry<K,V> entry:source.entrySet()) { 
    if (count >= max) break; 

    target.put(entry.getKey(), entry.getValue()); 
    count++; 
    } 
    return target; 
} 

的複雜性仍然是O(n)(我懷疑,人們可以(1)),但你使用它像一個工具實現Ø沒有「看」的循環:

SortedMap<Integer, String> firstFive = Util.putFirstEntries(5, sourceMap); 
6

還有SortedMap.headMap()但是,您必須傳遞元素的密鑰才能繼續。你可以遍歷N個元素在Map.keySet()找到它,例如:

Integer toKey = null; 
int i = 0; 
for (Integer key : myMap.keySet()) { 
    if (i++ == N) { 
     toKey = key; 
     break; 
    } 
} 

// be careful that toKey isn't null because N is < 0 or >= myMap.size() 
SortedMap<Integer, String> copyMap = myMap.headMap(toKey); 
0

你也可以使用一個ordored迭代器遞減ID爲實例,以獲得第X個記錄,訂貨:

Iterator<Integer> iterator = myMap.descendingKeySet().iterator(); 
6

使用Java的8+功率:

TreeMap<Integer, String> myNewMap = myMap.entrySet().stream() 
    .limit(3) 
    .collect(TreeMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), Map::putAll);