通过位置或索引从Android中的HashMap获取键

Posted

技术标签:

【中文标题】通过位置或索引从Android中的HashMap获取键【英文标题】:Get key from HashMap in Android by position or index 【发布时间】:2015-05-12 22:59:33 【问题描述】:

我有:

public static HashMap<String, String> CHILD_NAME_DOB = new HashMap<>();

假设CHILD_NAME_DOB 中的值为:

<adam,15121990>
<roy,01051995>
<neha,05091992>
<alisha,11051992>

我正在尝试从CHILD_NAME_DOB 获取最后一个关键元素。也就是说,我想从上面的示例中获取密钥alisha 到临时的String name

我还想知道如何按索引获取数据。

例如:如果 int index = 2 ,我想在 String name 中键入 "Neha"

TIA。

编辑:DateOfBirth 值(CHILD_NAME_DOB 中的值数据)是动态的并且是未知的。所以THIS LINK不是我想要的。

【问题讨论】:

HashMaps 没有索引。可能您正在寻找的是LinkedHashMap,尽管这是任何人的猜测。 @EJP,是的,我的错。我想,我应该去LinkedHashMap 嘿伙计们,如果我喜欢this 怎么样。使用interator,但在iterator 之外声明String keyvalue 。这样我就得到了最后一个关键元素。 【参考方案1】:

单线解决方案:

首先请注意,Java HashMap 不保证条目的顺序。因此,每次迭代 HashMap 时,条目都会出现在不同的位置。您将需要LinkedHashMap 来保证可预测的迭代顺序。

Map<String, String> CHILD_NAME_DOB = new LinkedHashMap<>();

通过索引获取键:

key = (new ArrayList<>(CHILD_NAME_DOB.keySet())).get(index)

通过索引获取值:

CHILD_NAME_DOB.get(key)

【讨论】:

大量研发得到答案后【参考方案2】:

感谢@Pentium10 提供this answer. 我根据自己的需要对它进行了少许修改。

String key="default";
Iterator myVeryOwnIterator = CHILD_NAME_DOB.keySet().iterator();
while(myVeryOwnIterator.hasNext()) 
     key=(String)myVeryOwnIterator.next();
     //String value=(String)meMap.get(key);
     
Toast.makeText(viewEnterChildExp.getContext(), "Key: "+key , Toast.LENGTH_LONG).show();

我得到了最后一个关键元素。

我会尽快更新,我也会找到一种简单的按索引键的方法。

【讨论】:

这将可靠地为 HashMap 工作。正如我在回答中所说,您需要使用 LinkedHashMap。 起初HashMap 工作。但后来,经过一些随机测试,它返回了意想不到的结果。然后我尝试了LinkedHashMap,它也适用于我的随机测试。所以最后,我选择了LinkedHashMap。谢谢@aioobe。 您是否有机会使用 Java 8?【参考方案3】:

这样获取密钥的方式....

public static String getHashMapKeyFromIndex(HashMap hashMap, int index)

    String key = null;
    HashMap <String,Object> hs = hashMap;
    int pos=0;
    for(Map.Entry<String, Object> entry : hs.entrySet())
    
        if(index==pos)
            key=entry.getKey();
        
        pos++;
    
    return key;


【讨论】:

【参考方案4】:

您也可以使用 ArrayMap 代替 HashMap。要通过索引获取值,请使用:

ArrayMap.valueAt(index);

要在索引处获取密钥,请使用:

ArrayMap.keyAt(index);

【讨论】:

【参考方案5】:

HashMap 不支持获取“最后一个”键并按索引获取。您可以使用 LinkedHashMap 并通过迭代查找索引为 2 的元素(或最后一个元素)。但这将是一个 O(n) 操作。

如果键/值的顺序对您很重要并且您希望进行基于索引的查找,我建议您使用 List&lt;Pair&lt;String, String&gt;&gt;

如果基于键和基于索引的查找对您很重要,您可以使用由ListHashMap 组成的组合数据结构,但请注意删除元素将是O(n)

【讨论】:

嗯。可能你是对的。其他答案也让我拭目以待【参考方案6】:

您可以创建一个类 Child

public class Child()
private String name;
private String number;

....


然后把这个对象放到一个List中

public static List<Child> CHILD_NAME_DOB = new ArrayList<Child>(); // using LinkedList would defeat the purpose

通过这种方式,您可以调用方法get(int index),该方法返回此列表中指定位置的元素。

在你的例子中

<adam,15121990>
<roy,01051995>
<neha,05091992>
<alisha,11051992>

调用CHILD_NAME_DOB.get(2)你会得到&lt;neha,05091992&gt;(作为子对象)

【讨论】:

如果您访问索引,为什么还要LinkedList 这当然会失去与地图相关的所有好处,例如 O(1) 中基于键的查找。 他如何通过 O(1) 中的索引访问“行”? Map 没有索引的概念。 哈希码和所有hashmap索引得到的值【参考方案7】:

HashMap 没有排序的概念,因此获取第 n 个条目没有意义。您可以改用TreeMap,它按其键排序。

但是,您应该重新考虑您的模型,因为您似乎有利益冲突。一方面,通过索引访问是典型的Lists,而通过键访问是典型的Maps。我不确定在哪种情况下你会想要两者都做。

如果您真的想同时进行索引和键访问,您可以编写自己的数据结构,将数据存储在列表中,并结合从键到索引的映射,反之亦然。我建议不要这样做,但如果这确实是您想要的,那么我认为这是最好的解决方案。

【讨论】:

【参考方案8】:

我知道这不是最好的解决方案,但是这个解决方案呢(伪代码!)。只需将 List 和 Map 组合在一个类中即可。

public class UserBirthday 

    private List<String>        names          = new ArrayList<>();
    private Map<String, String> CHILD_NAME_DOB = new HashMap<String, String>();

    public void add(String name, String bd) 

        if (!CHILD_NAME_DOB.containsKey(name)) 
            names.add(name);
        
        CHILD_NAME_DOB.put(name, bd);

    

    public String getByName(String name) 
        return CHILD_NAME_DOB.get(name);
    

    public String getByIndex(int index) 
        return getByName(names.get(index)); // TODO: range test
    

    public static void main(String[] args) 

        UserBirthday ub = new UserBirthday();
        ub.add("dit", "12345678");
        ub.add("lea", "234239423");
        ub.add("alex", "43534534");
        ub.add("ted", "099098790");

        System.out.println(ub.getByIndex(2));
        System.out.println(ub.getByName("alex"));
    


如果您删除一个条目,您可能会遇到一些问题,但这应该只是一个建议。

【讨论】:

IMO 这是“语法糖”。当您调用getByIndex(int index) 时,您也会调用names.get(index),无论如何这需要O(n)。那么,和我的回答有什么不同呢? @FabrizioMorello “names.get(index) 需要 O(n)”是什么意思? namesList。当您调用getByIndex(int index) 时,此方法依次调用names.get(index)Listget 方法具有 O(n) 复杂度。 @FabrizioMorello 没有。 ArrayList 的 get 方法有 O(1)。这是基础......查看源代码或这个答案:***.com/questions/2182597/… 哦,对不起,你说得对。我的错 !但无论如何我的回答都是一样的。【参考方案9】:
    for (String key : hmList.keySet()) 
        String value = hmList.get(key);

        Log.e("HashMap values", "key=" + key + " ,value=" + value);
    

【讨论】:

以上是关于通过位置或索引从Android中的HashMap获取键的主要内容,如果未能解决你的问题,请参考以下文章

HashMap原理 — 扩容机制及存取原理

hashmap会问到数组索引,hash碰撞怎么解决

HashMap死锁分析

是否可以通过其位置从 HashMap 中获取元素?

如何通过在 Firestore 中的查询从索引中获取多个文档到其他索引

AutoCompleteTextView onItemClick 使用 HashMap 的项目位置或 id