2015-05-06 53 views
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 

回答

2

你可以得到您的TreeMap中的NavigableSet

喜歡的東西(沒有嘗試)

NavigableSet<T> keys = qMap.navigableKeySet().headSet("startKey"); 
Iterator<T> goBack = keys.descendingIterator(); 

,如果它使在性能上有很大的區別不知道。至少它似乎擺脫了你對floorKey的2000通話。

+0

請不要您必須強制轉換鍵集NavigableSet keys =(NavigableSet)a.navigableKeySet()。headSet(「startKey」);'headSet不包含請求的鍵本身,您必須手動添加它們(這是沒有問題的,因爲你必須要求他們)。 – KIC

+0

你有沒有發現這是否比你原來的方法更有效率? – Thilo

+0

是的,請參閱我的編輯 – KIC