从 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,而不是 MapsList