从ArrayList中的HashMap获取键和值

时间:2019-02-11 00:14:46

标签: java arraylist hashmap key-value

我有一个文件,可以获取所有数据并将其分离为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并使其返回其值?

4 个答案:

答案 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>>