有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从ArrayList中的HashMap获取键和值

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

:前面是key,后面是value

key1: 1
key2: 2
key3: 3

这是将文件数据放入map 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并让它返回它的值


共 (4) 个答案

  1. # 1 楼答案

    因此,如果您对使用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;
            }
        }
    
  2. # 2 楼答案

    我不明白你为什么要创建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,而不是一个ListMaps

  3. # 3 楼答案

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

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

    map.get("key1")
    

    即使你有上百万个这样的东西,它仍然会很快

    如果您制作单尺寸贴图并将其放入arraylist,因为您希望保留顺序,请使用LinkedHashMap。如果您需要能够处理重复的键,请使用guava的Multimap,或者制作一个Map<String, List<String>>

  4. # 4 楼答案

    您应该考虑将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));