2010-11-18 105 views
0

我正在尋找一個開源庫,它有一個隨機訪問地圖的實現。 我需要一個保存其散列索引的映射,但也像LinkedHashmap那樣按照插入順序對這些值進行索引,除非您不必遍歷它以查找例如。元件2事情是這樣的: Java隨機訪問地圖

Map m = new ArrayMap(); 
m.put("0", "v0"); 
m.put("1", "v1"); 
m.put("2", "v2"); 
m.put("3", "v3"); 
則:

assertEquals("v2", m.get("2")); 
assertEquals("v2", m.getAtIndex(2)); 

的想法是,這兩種類型的查找必須要快。

快速谷歌沒有找到任何東西,我沒有看到它在番石榴或公共收藏(我可能忽略了它)。 我現在沒有時間正確實施它。

+1

LinkedHashMap的[載體](http://download.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html#get%28java.lang.Object%29)'米。得到(「2」)' – Powerlord 2010-11-18 16:24:03

+0

它是靜態還是動態更新? – Jack 2010-11-18 16:32:02

+0

你在問'm.get(1)'和'm.get(「key」)'是O(1)嗎?並且是地圖中的'訂單'按鍵的順序? – DJClayworth 2010-11-18 16:37:16

回答

2

如果您的地圖是靜態的,或者它只是偶爾更新,則可以使用LinkedHashMapvalues()方法,該方法將地圖的值列表作爲Collection<T>。然後,您可以將該集合轉換爲一個數組,並且您將持續訪問這些元素,當然這會浪費一些內存來存儲額外的引用,但是您提出了兩個特別好的複雜性,因此需要權衡內存。如果您不需要獲取值而以混合方式添加它們,則這樣會很好。

唯一不同的方法是自己實現LinkedHashMap通過使用一個數組來代替鏈表來存儲插入順序,但是當需要保持性能足夠好的時候,你必須關心數組翻倍的容量。

+1

是的,我希望有人做到了這一點:) – AmanicA 2010-11-18 20:42:20

0

我認爲LinkedHashMap正是你所需要的。如果你想可以編寫自己的5號線長的類實現此邏輯

new ArrayList(map.values().values()).get(2); 

你可以使用它作爲地圖:

map.get("v2"); 

和列表。對於一個普通ImmutableMap

ImmutableMap<String, String> map = ... 
String v2 = map.entrySet().asList().get(2).getValue(); 

entrySet()asList()只需直接使用地圖的自己的條目的陣列,所以它的隨機接入和快速:

4

如果您Map可以是不可變的,你可以做到這一點。

+3

我想人們會看到所有這些方法調用,並認爲它很慢,但不,它應該是非常有效的。 – 2010-11-19 03:40:36

1

你想要用兩種不同的方式查找值。最簡單/最快速的方法是維護兩個集合,一個Map和一個ArrayList。

private final Map<String, String> map; 
private final List<String> list; 

public void put(String key, String value) { 
    map.put(key,value); 
    list.add(value); 
} 

public String get(String key) { 
    return map.get(key); 
} 

public String get(int index) { 
    return list.get(index); 
} 
+0

我傾向於此,但當然put()會返回Map接口中的任何以前的值,所以它(和remove())在保持內部列表更新方面稍微複雜一些。如果添加次數與檢索次數相比不足,那麼您可以按照其他人的建議重新生成整個陣列。 – 2010-11-18 19:22:43