通过位置或索引从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 key
和value
。这样我就得到了最后一个关键元素。
【参考方案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<Pair<String, String>>
。
如果基于键和基于索引的查找对您很重要,您可以使用由List
和HashMap
组成的组合数据结构,但请注意删除元素将是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)
你会得到<neha,05091992>
(作为子对象)
【讨论】:
如果您访问索引,为什么还要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)”是什么意思?
names
是List
。当您调用getByIndex(int index)
时,此方法依次调用names.get(index)
。 List
的 get
方法具有 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获取键的主要内容,如果未能解决你的问题,请参考以下文章