2011-03-08 28 views
70

如何從HashMap的位置檢索一個元素,有沒有可能?是否可以通過它的位置從HashMap中獲取元素?

+10

你是什麼意思的「位置」?哈希地圖不是有序的,所以它們沒有像「矢量」那樣的「位置」通常的概念。 – Mat

+0

您的意思是它的插入順序或其他順序? –

+0

@Mark:廣告訂單。 – Eugene

回答

80

HashMaps不保留排序:

此類不保證爲 地圖的順序;特別是, 它不保證訂單 將隨着時間的推移保持不變。

看看LinkedHashMap,它保證了可預測的迭代順序。

+5

這並沒有真正回答這個問題。下面的其他答案更有用。 – forresthopkinsa

+4

尊敬的是,這引用了*直接回答問題 –

+0

的文檔。即使訂單在一段時間內不是恆定的,仍可以通過給定的位置檢索其中一個成員。 – Beginner

12

使用LinkedHashMap:Map接口的

的哈希表和鏈接列表實現,具有可預知的迭代順序。這個實現與HashMap的不同之處在於它保持了一個雙向鏈表,它貫穿其所有條目。

+20

將保留訂單,但您仍然無法通過索引訪問商品。你必須迭代 – Bozho

+0

這個鏈接是舊版本的API。我會建議鏈接到Java 6或7 API。 – jzd

2

HashMap - 和底層數據結構 - 哈希表沒有位置的概念。與LinkedList或Vector不同,輸入密鑰被轉換爲存儲值的「桶」。這些存儲區的排列方式並不是在HashMap接口之外有意義,因此,在您認爲其他數據結構的意義上,您放入HashMap的項目並不按順序排列。

2

HashMap沒有概念的位置,所以沒有辦法按位置獲取對象。地圖中的對象是通過鍵設置和獲取的。

2

我假設你的位置是指你將元素插入到HashMap中的順序。在這種情況下,你想要使用LinkedHashMap。然而,LinkedHashMap不提供訪問器方法;你需要寫一個像

public Object getElementAt(LinkedHashMap map, int index) { 
    for (Map.Entry entry : map.entrySet()) { 
     if (index-- == 0) { 
      return entry.value(); 
     } 
    } 
    return null; 
} 
1

包含HashMap不允許按位置訪問,只知道大概的散列碼與和它可以檢索值,如果它可以計算出密鑰的哈希碼。 TreeMaps有一個排序的概念。 Linkedhas地圖保留了他們進入地圖的順序。

80

使用LinkedHashMap,當需要按位置檢索時,將值轉換爲ArrayList。

LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>(); 
/* Populate */ 
linkedHashMap.put("key0","value0"); 
linkedHashMap.put("key1","value1"); 
linkedHashMap.put("key2","value2"); 
/* Get by position */ 
int pos = 1; 
String value = (new ArrayList<String>(linkedHashMap.values())).get(pos); 
+2

總是需要從HashMap實例化一個密鑰的副本? – Richard

6

使用LinkedHashMap並使用此函數。

private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>(); 

定義像這樣和。

private Entry getEntry(int id){ 
     Iterator iterator = map.entrySet().iterator(); 
     int n = 0; 
     while(iterator.hasNext()){ 
      Entry entry = (Entry) iterator.next(); 
      if(n == id){ 
       return entry; 
      } 
      n ++; 
     } 
     return null; 
    } 

該函數可以返回所選條目。

27

如果要維護將元素添加到地圖的順序,請使用LinkedHashMap而不僅僅是HashMap

這裏有一個方法,可以讓你通過它在地圖索引得到一個值:

public Object getElementByIndex(LinkedHashMap map,int index){ 
    return map.get((map.keySet().toArray())[ index ]); 
} 
+0

最簡單的我必須說...而不是轉換每一件事,你只使用鍵盤。精湛的 – kirtan403

0

你可以嘗試實施類似的東西,看看:

Map<String, Integer> map = new LinkedHashMap<String, Integer>(); 
map.put("juan", 2); 
map.put("pedro", 3); 
map.put("pablo", 5); 
map.put("iphoncio",9) 

List<String> indexes = new ArrayList<String>(map.keySet()); // <== Parse 

System.out.println(indexes.indexOf("juan"));  // ==> 0 
System.out.println(indexes.indexOf("iphoncio"));  // ==> 3 

我希望這對你有用。

1

另一種工作方法是將地圖值轉換爲數組,然後在索引處檢索元素。使用以下方法100000個對象的LinkedHashMap 100 000元的試運行通過索引搜索導致以下結果:

//My answer: 
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){ 
    return map.values().toArray(new Particle[map.values().size()])[index]; 
} //68 965 ms 

//Syd Lambert's answer: 
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){ 
    return map.get((map.keySet().toArray())[ index ]); 
} //80 700 ms 

所有由LinkedHashMap的索引中的所有元素檢索似乎是相當繁重的操作。

7

如果出於某種原因,必須堅持HashMap中,你可以密鑰集轉換爲數組和索引鍵數組中得到的值在地圖上像這樣:

Object[] keys = map.keySet().toArray(); 

然後你可以訪問地圖,如:

map.get(keys[i]); 
+0

請注意,arr [i]應改爲:keys [i] –

相關問題