我有一个全局定义的 ArrayList 作为 ArrayList<Map<String, String>> mContactList;
。
现在,在其中一种方法中,我定义一个 HashMap,如下所示:
Map<String, String> NamePhoneType = new HashMap<String, String>();
NamePhoneType.put("Name", contactName); //contactName is returned from a query
NamePhoneType.put("Phone", phoneNumber); //phoneNumber is returned from a query
mContactList.add(NamePhoneType);
所以 mContactList
现在看起来像 [{Name=Abc, Phone=123}, {Name=def, Phone=456}...]
现在,当我尝试使用以下代码迭代 mContactList
时,我总是根据索引将键获取为 'Phone'
,将值获取为 '123'
或 '456'
。
public void onItemClick(AdapterView<?> av, View v, int index,long arg) {
Map<String, String> map = (Map<String, String>) av.getItemAtPosition(index);
Iterator<String> myVeryOwnIterator = map.keySet().iterator();
while (myVeryOwnIterator.hasNext()) {
String key = (String) myVeryOwnIterator.next();
String value = (String) map.get(key);
getNumber.setText(value);
}
}
});
我希望 Name
和所选索引的 Phone
位于 2 个单独的字符串中。我该怎么做?
最佳答案
我建议您创建一个名为 Contact
的类,而不是像您那样使用 map 。然后您的 ArrayList 将被声明为
ArrayList<Contact> mContactList;
Contact 类看起来像
public class Contact {
private String name;
private String phoneNumber;
public Contact (String name, String phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
public String getName() {
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
}
每当您最终使用嵌套数据结构时,通常都表明您需要重新考虑您的设计,因为通常有更好的方法来实现。
<小时/>但是,回答你的问题;请注意这段代码正在做什么。
Map<String, String> map = (Map<String, String>) av.getItemAtPosition(index);
Iterator<String> myVeryOwnIterator = map.keySet().iterator();
while (myVeryOwnIterator.hasNext()) {
String key = (String) myVeryOwnIterator.next();
String value = (String) map.get(key);
getNumber.setText(value);
}
您正在迭代一个映射,该映射(似乎)总是有两对:
"Name", nameValue
"Phone", phoneValue
无需遍历 Map 即可获取所需的值。您的代码应如下所示:
Map<String, String> map = (Map<String, String>) av.getItemAtPosition(index);
String phoneNumber = map.get("Phone");
String name = map.get("Name");
关于java - 迭代 HashMap 的 ArrayList 很困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11422165/