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

时间:2015-03-11 08:36:25

标签: java android hashmap

我有:

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,我想在"Neha"中找到关键String name

TIA。

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

9 个答案:

答案 0 :(得分:4)

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

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

我会尽快更新,我也可以找到一种通过索引键入的简单方法。

答案 1 :(得分:1)

获取&#34;最后&#34; HashMap不支持密钥和按索引获取。您可以使用LinkedHashMap并通过迭代查找具有索引2(或最后一个元素)的元素。但这将是O(n)操作。

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

如果基于密钥和基于索引的查找对您都很重要,则可以使用由ListHashMap组成的组合数据结构,但请注意,删除元素将为{ {1}}。

答案 2 :(得分:1)

您可以创建一个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)您将获得<neha,05091992>(作为Child对象)

答案 3 :(得分:1)

通过hashmap中的索引获取密钥:

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

按索引获取值:

CHILD_NAME_DOB.get(key)

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

我知道这不是最好的解决方案,但是这个解决方案呢(伪代码!)。只需将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"));
    }

}

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

您也可以使用ArrayMap而不是HashMap。要通过索引使用获取值:

ArrayMap.valueAt(index);

要使用索引使用密钥:

ArrayMap.keyAt(index);

答案 8 :(得分:0)

这种获取密钥的方式。...

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;

}