这是按名称获取ArrayList<NameValuePair>
值的正确方法吗?
private String getValueByKey(ArrayList<NameValuePair> _list, String key) {
for(NameValuePair nvPair : _list) {
if(nvPair.getName().equals(key)) {
return nvPair.getValue().toString();
}
}
return null;
}
或者,是否有按名称访问ArrayList<NameValuePair>
值的快捷方式?
答案 0 :(得分:10)
不 - 你将它们存储为一个列表,而这个列表并非被“密钥”访问 - 它没有任何密钥概念。
听起来你真的想要像Map<String, String>
这样的东西 - 假设你只需要为每个密钥存储一个值。
如果你坚持使用ArrayList
(我至少会将参数类型更改为List
,如果不是Iterable
,那么这就是你需要的那些)那么你呢很好。
答案 1 :(得分:7)
如果您可以改为使用Map
,则其工作方式如下:
Map<String,String> myMap = new HashMap<>();
myMap.put("key1","value1");
myMap.put("key2","value2");
myMap.put("key3","value3");
String str = myMap.get("key1");
//equivalent to your
String str = getValueByKey(myList,"key1");
使用HashMap
键不会存储为列表,因此这将更快,您不必使用函数来迭代容器。
然后,您可以使用myMap.keySet()
和myMap.values()
访问所有值,请参阅documentation。
答案 2 :(得分:4)
您似乎需要其他数据结构。例如Map<Name, Value>
或Map<Name, NameValuePair>
,如果您愿意的话。
第一个解决方案可能更正确,如果您已经拥有使用对列存储在列表中的事实的代码,则第二个解决方案更容易实现。 Map允许获取值集合; Collection
是List
的超级界面。
答案 3 :(得分:1)
如果您的密钥或名称是整数,建议您改为使用SparseArray
:http://developer.android.com/reference/android/util/SparseArray.html
然后,您可以使用不同的函数来使用数组中的键,值或索引检索所需的值。
答案 4 :(得分:0)
您需要将ArrayList<NameValuePair>
传递给Map<String, String>
使用Java 8流:
private String getValueByKey(ArrayList<NameValuePair> _list, String key) {
return _list.stream().collect(Collectors.toMap(NameValuePair::getName, NameValuePair::getValue)).get(key);
}
但是对于代码效率而言,最好将列表收集到地图中并在该地图上工作。函数getValueByKey不是必需的:
Map<String, String> nvpMap = _list.stream().collect(Collectors.toMap(NameValuePair::getName, NameValuePair::getValue));
String value = nvpMap.get(key);
希望这会有所帮助!