我有一个文件,可以获取所有数据并将其分离为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的类中,这是输出
[{key1=1}, {key2=2}, {key3=3}]
所以我的主要问题是,如何获得key1
并使其返回其值?
答案 0 :(得分:1)
因此,如果您对使用Java-8感兴趣,则如果map列表包含键为key1
的任何条目,则将返回第一个条目值,否则将返回默认值
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 :(得分:1)
您应该考虑将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));
答案 2 :(得分:1)
我不明白您为什么要创建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
,而不是List
的{{1}}。
答案 3 :(得分:0)
您确定这是您想要的数据结构吗?
一个映射可以包含多个键/值对。为什么这里没有一个包含所有3个键/值对的哈希表,此时,您可以执行以下操作:
map.get("key1")
即使有数百万个,它仍然会很快。
如果由于要保留顺序而制作单个尺寸的地图并将其放入arraylist中,请使用LinkedHashMap
。如果您需要能够处理重复的键,请使用番石榴的Multimap
或制作一个Map<String, List<String>>
。