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

Get key from HashMap in Android by position or index

我有:

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不是我想要的。

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

如果 keys/values 的顺序对您很重要并且您希望进行基于索引的查找,我建议您使用 List<Pair<String, String>>

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

您可以创建 class Child

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

....

}

然后将此 object 放入列表

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

这样你就可以调用方法get(int index),即returns这个列表中指定位置的元素。

在你的例子中

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

调用 CHILD_NAME_DOB.get(2) 你会得到 <neha,05091992>(因为 Child object)

HashMap没有顺序的概念,所以得到第n个条目没有意义。您可以改用 TreeMap,它按其键排序。

但是,您应该重新考虑您的模型,因为您似乎有利益冲突。一方面,按索引访问是典型的 Lists,而按键访问是典型的 Maps。我不确定您希望在哪种情况下同时执行这两项操作。

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

我知道这不是最好的解决方案,但是这个解决方案怎么样(伪代码!)。只需将 List 和 Map 合二为一 class.

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"));
    }

}

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

感谢@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();

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

我会在找到按索引键的简单方法后尽快更新。

    for (String key : hmList.keySet()) {
        String value = hmList.get(key);

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

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

ArrayMap.valueAt(index);

要获取索引处的键,请使用:

ArrayMap.keyAt(index);

单行解法:

首先请注意,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)

通过这种方式获取密钥....

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;

}