9

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

4

5 回答 5

10

不-您将它们存储为一个列表,该列表并非旨在通过“键”访问-它没有任何键的概念。

听起来你真的想要一个Map<String, String>- 假设你只需要为每个键存储一个值。

如果您坚持使用ArrayList(并且我至少将参数类型更改为List,如果没有Iterable考虑到这就是您所需要的),那么您所拥有的一切都很好。

于 2013-06-05T12:20:05.187 回答
9

如果您可以使用 aMap代替,它们的工作方式如下:

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");

使用 aHashMap键不会存储为列表,因此这会更快,并且您不必使用函数来迭代容器。

然后,您可以使用 and 访问所有值myMap.keySet()myMap.values()请参阅文档

于 2013-06-05T12:29:12.457 回答
4

看来您需要其他数据结构。例如Map<Name, Value>,或者Map<Name, NameValuePair>如果你愿意。

第一个解决方案可能更正确,如果您已经拥有使用对存储在列表中这一事实的代码,则第二个解决方案更容易实现。Map 允许获取值的集合;Collection是一个超级接口List

于 2013-06-05T12:21:18.157 回答
1

如果您的键或名称是整数,我建议您SparseArray改用:http: //developer.android.com/reference/android/util/SparseArray.html

然后,您可以使用不同的函数来使用数组中的键、值或索引来检索您想要的值。

于 2013-06-05T12:26:24.833 回答
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);

希望这可以帮助!!!

于 2019-11-18T18:15:04.570 回答