我正在尝试使用SnakeYAML将Yaml文件加载到MultiMap中,但是我一直遇到以下异常:java.base/java.util.LinkedHashMap cannot be cast to com.google.common.collect.Multimap
。有什么方法可以有效地将SnakeYAML对象加载到Guava MultiMap中吗?我知道您可以使用常规的HashMaps来执行此操作,但是我的目标Yaml具有重复的键,因此需要使用MultiMaps。我在这里先向您的帮助表示感谢。我使用SnakeYAML填充MultiMap的代码如下:
//Read the config file
InputStream configIn;
try {
configIn = FileUtil.loadFileAsStream(configPath);
//Load the config file into the YAML object
pluginConf = LinkedHashMultimap.create((Multimap<String, Object>) configData.load(configIn));
}
catch(FileNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
编辑:具有重复密钥的示例YAML
join:
message: "JMessage1"
quit:
message: "QMessage1"
join:
message: "JMessage2"
quit:
message: "QMessage2"
join:
message: "JMessage3"
quit:
message: "QMessage3"
答案 0 :(得分:1)
我确实设法解决了这个问题,但是我将regex与常规的HashMaps一起使用,而不是像我最初打算的那样使用Guava Multimaps。例如,这是一个具有重复密钥的YAML文件:
join:
message: "JMessage1"
quit:
message: "QMessage1"
join:
message: "JMessage2"
quit:
message: "QMessage2"
要解析所有消息,我所做的只是简单地向每个重复的父键添加数字(join
变成join1
,quit
变成{{1 }}, 等等)。由于每个键中都有一个数字,因此可以使用以下正则表达式轻松地将它们还原为只说quit1
或join
:quit
在迭代HashMap的for循环中。由于HashMap条目现在在循环中读为str.replaceAll("[^a-zA-Z.]", "").toLowerCase()
,join
,quit
,join
,因此可以使用以下代码片段轻松地获取其值:
quit
之后,可以将值添加到ArrayList或其他集合中。就我而言,我使用ArrayList并将YAML文件的属性分配给对象的实例变量。我在项目中的其中一个班级的以下代码片段完成了此任务:
if(entry.equals("join")){
//Do stuff
}
并不是真的使用HashMaps来允许重复复制,就像我最初要求的那样,但是这个“ hack”对我来说是完美的。希望这可以帮助其他希望这样做的人。