从 ArrayList 中的 HashMap 获取键和值
get key and value from HashMap within ArrayList
我有一个文件,我获取所有数据并将其分离到一个 HashMap 中。
该文件如下所示。
:
之前是key
,之后是value
key1: 1
key2: 2
key3: 3
这是将文件数据放入地图 ArrayList 的代码:
protected List<Map<String, String>> yaml_parse(BufferedReader filename) throws IOException{
String result;
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
while ((result = filename.readLine()) != null) {
Map<String, String> map = new HashMap<String, String>();
String key = result.substring(0, result.indexOf(":"));
String value = result.substring(result.lastIndexOf(":") + 2);
map.put(key, value);
list.add(map);
}
return list;
}
在我调用函数和 println 的另一个 class 中,这是输出
[{key1=1}, {key2=2}, {key3=3}]
所以我的主要问题是,我如何获得 key1
并使其具有 return 的价值?
因此,如果您有兴趣使用 java-8,如果地图列表包含任何键为 key1
的条目,将 return 作为第一个条目值,否则它将 return默认值
list.stream().flatMap(map->map.entrySet().stream().filter(entry->entry.getKey().equals("key1"))).findFirst()
.orElse(new AbstractMap.SimpleEntry("key1", "default value")).getValue();
只需使用普通的for循环
for(Map<String, String> map : list) {
if(map.containsKey("key1")) {
result = map.get("key1");
break;
}
}
你确定这是你想要的数据结构吗?
一张地图可以包含超过 1 个 key/value 对。为什么这里没有一个哈希图,包含所有 3 个 key/value 对,此时,您可以这样做:
map.get("key1")
即使你有数百万个,它仍然会很快。
如果您要制作单一大小的地图并将它们放入数组列表中,因为您希望保留顺序,请使用 LinkedHashMap
。如果你需要能够处理重复的键,使用 guava 的 Multimap
,或者制作一个 Map<String, List<String>>
.
您应该考虑将 List<Map>
更改为 Map
。您可以使用:
Map<String, String> map = list.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
如果您想使用当前的数据结构,您可以像这样获得所需的值:
private Optional<String> getValue(List<Map<String, String>> list, String key) {
return list.stream()
.filter(m -> m.containsKey(key))
.map(m -> m.get(key))
.findFirst();
}
并按如下方式使用它:-
Optional<String> value = getValue(list, "key2");
System.out.println(value.orElse(null));
我不明白你为什么要创建 List
地图。一个 Map
会让你放几个键值对。这是一种可行的方法:
protected Map<String, String> yaml_parse(BufferedReader filename) throws IOException{
String result;
Map<String, String> map = new HashMap<String, String>();
while ((result = filename.readLine()) != null) {
//keyValue[0] = key, keyValue[1] = value
String[] keyValue = result.split(": ");
map.put(keyValue[0], keyValue[1]);
}
return map;
}
你会像这样使用它:
Map<String, String> map = yaml_parse("myFile.yaml");
String key1Value = map.get("key1"); //Stores key1's value into key1Value
我认为您可能使用了错误的数据结构。从你的问题来看,你似乎只想要 Map
,而不是 Maps
的 List
。
我有一个文件,我获取所有数据并将其分离到一个 HashMap 中。 该文件如下所示。
:
之前是key
,之后是value
key1: 1
key2: 2
key3: 3
这是将文件数据放入地图 ArrayList 的代码:
protected List<Map<String, String>> yaml_parse(BufferedReader filename) throws IOException{
String result;
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
while ((result = filename.readLine()) != null) {
Map<String, String> map = new HashMap<String, String>();
String key = result.substring(0, result.indexOf(":"));
String value = result.substring(result.lastIndexOf(":") + 2);
map.put(key, value);
list.add(map);
}
return list;
}
在我调用函数和 println 的另一个 class 中,这是输出
[{key1=1}, {key2=2}, {key3=3}]
所以我的主要问题是,我如何获得 key1
并使其具有 return 的价值?
因此,如果您有兴趣使用 java-8,如果地图列表包含任何键为 key1
的条目,将 return 作为第一个条目值,否则它将 return默认值
list.stream().flatMap(map->map.entrySet().stream().filter(entry->entry.getKey().equals("key1"))).findFirst()
.orElse(new AbstractMap.SimpleEntry("key1", "default value")).getValue();
只需使用普通的for循环
for(Map<String, String> map : list) {
if(map.containsKey("key1")) {
result = map.get("key1");
break;
}
}
你确定这是你想要的数据结构吗?
一张地图可以包含超过 1 个 key/value 对。为什么这里没有一个哈希图,包含所有 3 个 key/value 对,此时,您可以这样做:
map.get("key1")
即使你有数百万个,它仍然会很快。
如果您要制作单一大小的地图并将它们放入数组列表中,因为您希望保留顺序,请使用 LinkedHashMap
。如果你需要能够处理重复的键,使用 guava 的 Multimap
,或者制作一个 Map<String, List<String>>
.
您应该考虑将 List<Map>
更改为 Map
。您可以使用:
Map<String, String> map = list.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
如果您想使用当前的数据结构,您可以像这样获得所需的值:
private Optional<String> getValue(List<Map<String, String>> list, String key) {
return list.stream()
.filter(m -> m.containsKey(key))
.map(m -> m.get(key))
.findFirst();
}
并按如下方式使用它:-
Optional<String> value = getValue(list, "key2");
System.out.println(value.orElse(null));
我不明白你为什么要创建 List
地图。一个 Map
会让你放几个键值对。这是一种可行的方法:
protected Map<String, String> yaml_parse(BufferedReader filename) throws IOException{
String result;
Map<String, String> map = new HashMap<String, String>();
while ((result = filename.readLine()) != null) {
//keyValue[0] = key, keyValue[1] = value
String[] keyValue = result.split(": ");
map.put(keyValue[0], keyValue[1]);
}
return map;
}
你会像这样使用它:
Map<String, String> map = yaml_parse("myFile.yaml");
String key1Value = map.get("key1"); //Stores key1's value into key1Value
我认为您可能使用了错误的数据结构。从你的问题来看,你似乎只想要 Map
,而不是 Maps
的 List
。