Java 从ArrayList中的HashMap获取键和值

Java 从ArrayList中的HashMap获取键和值,java,arraylist,hashmap,key-value,Java,Arraylist,Hashmap,Key Value,我有一个文件,我得到了所有的数据,并将其分离成一个HashMap。 文件如下所示 前:是键,后是值 这是将文件数据放入map ArrayList的代码: 受保护列表yaml_parseBufferedReader文件名引发IOException{ 字符串结果; 列表=新的ArrayList; 而result=filename.readLine!=null{ Map Map=新的HashMap; 字符串键=result.substring0,result.indexOf:; 字符串值=result

我有一个文件,我得到了所有的数据,并将其分离成一个HashMap。 文件如下所示

前:是键,后是值

这是将文件数据放入map ArrayList的代码:

受保护列表yaml_parseBufferedReader文件名引发IOException{ 字符串结果; 列表=新的ArrayList; 而result=filename.readLine!=null{ Map Map=新的HashMap; 字符串键=result.substring0,result.indexOf:; 字符串值=result.substringresult.lastIndexOf:+2; map.putkey,value; list.addmap; } 退货清单; } 在另一个类中,我调用函数和println,这是输出

[{key1=1}, {key2=2}, {key3=3}]

所以我的主要问题是,如何获取key1并让它返回其值?

因此,如果您对使用java-8感兴趣,那么如果映射列表包含任何带有key as 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;
        }
    }

所以,如果您对使用java-8感兴趣,那么如果映射列表包含任何键为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;
        }
    }

您确定这是您想要的数据结构吗

一个映射可以包含多个键/值对。为什么不在这里创建一个包含所有3个键/值对的hashmap,此时,您可以执行以下操作:

map.get("key1")
即使你有上百万个这样的东西,它仍然会很快


如果您制作单尺寸贴图并将其放入arraylist,因为您希望保持顺序,请使用LinkedHashMap。如果您需要能够处理重复的键,请使用guava的Multimap,或制作一张地图。

您确定这是您想要的数据结构吗

一个映射可以包含多个键/值对。为什么不在这里创建一个包含所有3个键/值对的hashmap,此时,您可以执行以下操作:

map.get("key1")
即使你有上百万个这样的东西,它仍然会很快


如果您制作单尺寸贴图并将其放入arraylist,因为您希望保持顺序,请使用LinkedHashMap。如果您需要能够处理重复键,请使用guava的Multimap或制作地图。

您应该考虑将列表更改为地图。您可以使用以下方法执行此操作:

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();
}
Map<String, String> map = yaml_parse("myFile.yaml");
String key1Value = map.get("key1"); //Stores key1's value into key1Value
并按如下方式使用:-

Optional<String> value = getValue(list, "key2");
System.out.println(value.orElse(null));

您应该考虑将列表更改为地图。您可以使用以下方法执行此操作:

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();
}
Map<String, String> map = yaml_parse("myFile.yaml");
String key1Value = map.get("key1"); //Stores key1's value into key1Value
并按如下方式使用:-

Optional<String> value = getValue(list, "key2");
System.out.println(value.orElse(null));

我不明白你为什么要创建地图列表。映射将允许您放置多个键值对。以下是一种可行的方法:

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;
}
你可以这样使用它:

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();
}
Map<String, String> map = yaml_parse("myFile.yaml");
String key1Value = map.get("key1"); //Stores key1's value into key1Value

我认为您可能使用了错误的数据结构。从你的问题来看,你似乎只想要一张地图,而不是地图列表。

我不明白你为什么要创建地图列表。映射将允许您放置多个键值对。以下是一种可行的方法:

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;
}
你可以这样使用它:

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();
}
Map<String, String> map = yaml_parse("myFile.yaml");
String key1Value = map.get("key1"); //Stores key1's value into key1Value

我认为您可能使用了错误的数据结构。从你的问题来看,似乎你只想要一张地图,而不是地图列表。

关于什么的列表有两个地图对象,每个地图都有键1?列表中有3个地图对象,分别是:[{key1=1},{key2=2},{key3=3}]你到底为什么要建立一个单条目地图列表?这毫无意义。如果您使用映射作为键/值对的持有者,那么停止懒惰,创建一个类,然后创建一个该类的列表。该列表有两个映射对象,每个映射都有key1?该列表中有3个映射对象,它们是:[{key1=1},{key2=2},{key3=3}],您究竟为什么要构建一个单条目映射列表?这毫无意义。如果您将映射用作键/值对的持有者,那么停止懒惰,创建一个类,然后创建该类的列表。