通过Java的LinkedHashmap列表迭代



我正在使用linkedhashmap在阅读yaml文件时保留订单。

reader = new YamlReader(new FileReader(file));
read_contents = (Map<String, List<LinkedHashMap<String, Object>>>) reader.read();
List<LinkedHashMap<String, Object>> all_items = read_contents.get("XYZ");
for (LinkedHashMap<String, Object> item : all_items) {
    for (Map.Entry<String, Object> entry : item.entrySet()) {
        <some code>
    }
}

在以下错误:

线程" main" java.lang.classcastException中的例外: java.util.hashmap不能施放到java.util.linkedhashmap

编辑:多亏了评论,我现在意识到订购很重要(我错过了原始答案中的这一点(。真正的问题是YamlReader没有内部使用LinkedHashMap,因此当您访问列表的每个元素时,订单已经丢失。

如果您可以访问读者的代码,也许可以对其进行修改,以便它在内部使用LinkedHashMap而不是HashMap。如果不这样


现在我的原始答案...

错误说明了这一切:HashMap不能将其投入到LinkedHashMap。因此,如果您将其投射到HashMap而不是LinkedHashMap,那就可以了。但是,使用客户端代码中的特定实现通常被认为是不良实践,因为您不知道YamlReader创建的地图的具体类别。相反,您应该只使用接口Map

reader = new YamlReader(new FileReader(file));
read_contents = (Map<String, List<Map<String, Object>>>) reader.read();
List<Map<String, Object>> all_items = read_contents.get("XYZ");
for (Map<String, Object> item : all_items) {
    for (Map.Entry<String, Object> entry : item.entrySet()) {
        // <some code>
    }
}

这更安全,因为您的程序到接口而不是混凝土类,这是一个基本的编程原理。

使用Java 8,您可以使用更紧凑的代码实现相同的操作:

all_items.forEach(item -> item.forEach((k, v) -> /* <some code> */));

最新更新