1
我需要的是來自所請求鍵值的子列表向後n個條目。由於地圖真的很大,我想知道「floorKey」是否是完成此任務的最有效方式。從一個特定的位置(鍵)向後迭代/子圖映射TreeMap
該代碼可以寫得更快嗎?
TreeMap qMap = new TreeMap();
Object key = "startKey";
for (int i=0; i<2000; i++) {
key = qMap.floorKey(key);
}
// get a collection holding last 2000 history objects at startkey
Collection neededValues = qMap.subMap(key, "startKey").values();
編輯:
基於@蒂洛的答案,我做了一個快速的drity測試和是他的方法是快:
public static void main(String[] args) {
TreeMap a = new TreeMap();
for (int i=0; i<5000000; i++) a.put("a"+i, i);
int i=2000;
Object dummy;
System.out.println("start a");
long start = new Date().getTime();
NavigableSet keys = (NavigableSet) a.navigableKeySet().headSet("a"+670812); // some random position
Iterator goBack = keys.descendingIterator();
while (goBack.hasNext() && i>0) {
dummy = goBack.next();
i--;
}
System.out.println("run a " + (new Date().getTime() - start));
System.out.println("start b");
start = new Date().getTime();
Object key = "a"+670812;
for (i=0; i<2000; i++) {
key = a.floorKey(key);
}
Object dummy2 = a.subMap(key, "a" + 670812).values();
System.out.println("run b " + (new Date().getTime() - start));
}
打印
start a
run a 6
start b
run b 7
請不要您必須強制轉換鍵集NavigableSet keys =(NavigableSet)a.navigableKeySet()。headSet(「startKey」);'headSet不包含請求的鍵本身,您必須手動添加它們(這是沒有問題的,因爲你必須要求他們)。 – KIC
你有沒有發現這是否比你原來的方法更有效率? – Thilo
是的,請參閱我的編輯 – KIC