2011-03-08 25 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] –

相关问题