登录

是否可以根据元素的位置从HashMap获取元素?

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 修改于2011-03-09
  • 该问题已被编辑
  • 提问者: Stack Overflow用户
  • 提问时间: 2011-03-09 03:10

如何根据元素的位置从HashMap中检索元素,这是可能的吗?

浏览 225 关注 0 得票数 107
  • 得票数为Stack Overflow原文数据
原文
回答于2011-03-09
得票数 2

HashMap -和底层的数据结构-哈希表,没有位置的概念。与LinkedList或向量不同,输入键被转换为存储值的“存储桶”。这些存储桶不是以在HashMap接口之外有意义的方式排序的,因此,放入HashMap中的项的顺序与其他数据结构的顺序不同

回答于2011-03-09
得票数 2

HashMap没有位置的概念,因此无法通过位置获取对象。贴图中的对象是通过关键点设置和获取的。

回答于2011-03-09
得票数 3

我假设“位置”指的是将元素插入到HashMap中的顺序。在这种情况下,您需要使用LinkedHashMap。但是,LinkedHashMap没有提供访问器方法;您需要编写一个类似这样的方法

public Object getElementAt(LinkedHashMap map, int index) {
    for (Map.Entry entry : map.entrySet()) {
        if (index-- == 0) {
            return entry.value();
    return null;
}
回答于2011-03-09
得票数 1

HashMaps不允许按位置访问,它只知道散列码,并且如果它可以计算键的散列码,它就可以检索值。TreeMaps有排序的概念。Linkedhas地图保留了它们进入地图的顺序。

0
修改于2013-06-13
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2011-04-28 22:14
得票数 117

使用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);
评论 0
0
回答于2013-05-20
得票数 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;
    }

该函数可以返回所选条目。

修改于2016-11-26
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2015-10-28 01:55
得票数 56

如果希望保持将元素添加到映射中的顺序,请使用 LinkedHashMap ,而不是只使用 HashMap

下面是一种方法,它允许您通过地图中的索引来获取值:

public Object getElementByIndex(LinkedHashMap map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
}
Stack Overflow用户
回答于2016-01-16
得票数 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

我希望这对你有用。

原文
回答于2016-12-06
得票数 3

另一种可行的方法是将映射值转换为数组,然后在索引处检索元素。使用以下方法在LinkedHashMap中对100,000个对象进行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中按索引检索元素似乎是一项相当繁重的操作。

操作
修改于2018-03-01
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2017-06-15 18:27
得票数 22

如果出于某种原因,您必须使用hashMap,您可以将keySet转换为数组,并对数组中的键进行索引,以获得映射中的值,如下所示:

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

然后您可以访问地图,如下所示:

map.get(keys[i]);
操作
回答于2019-05-16
得票数 2

您可以使用以下代码来获取密钥: String [] keys = (String[]) item.keySet().toArray(new String[0]);

并使用以下项的键获取插入到HashMap中的对象或列表: item.get(keys[position]);

回答于2019-11-08
得票数 4

默认情况下,java LinkedHasMap不支持按位置获取值。所以我建议使用定制的 IndexedLinkedHashMap

public class IndexedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
    private ArrayList<K> keysList = new ArrayList<>();
    public void add(K key, V val) {
        super.put(key, val);
        keysList.add(key);
    public void update(K key, V val) {
        super.put(key, val);
    public void removeItemByKey(K key) {
        super.remove(key);
        keysList.remove(key);
    public void removeItemByIndex(int index) {
        super.remove(keysList.get(index));
        keysList.remove(index);
    public V getItemByIndex(int i) {
        return (V) super.get(keysList.get(i));