按名称获取ArrayList <namevaluepair>值</namevaluepair>

时间:2013-06-05 12:17:24

标签: java android

这是按名称获取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>值的快捷方式?

5 个答案:

答案 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允许获取值集合; CollectionList的超级界面。

答案 3 :(得分:1)

如果您的密钥或名称是整数,建议您改为使用SparseArrayhttp://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);

希望这会有所帮助!