按位置或索引从 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>>
。
如果基于键和基于索引的查找对您都很重要,您可以使用由 List
和 HashMap
组成的组合数据结构,但请注意,删除元素将是 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;
}
我有:
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>>
。
如果基于键和基于索引的查找对您都很重要,您可以使用由 List
和 HashMap
组成的组合数据结构,但请注意,删除元素将是 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;
}