我正在使用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> */));