将SnakeYAML加载到Guava MultiMap中

时间:2018-12-01 21:25:40

标签: java hashmap guava snakeyaml

我正在尝试使用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"

1 个答案:

答案 0 :(得分:1)

我确实设法解决了这个问题,但是我将regex与常规的HashMaps一起使用,而不是像我最初打算的那样使用Guava Multimaps。例如,这是一个具有重复密钥的YAML文件:

join:
  message: "JMessage1"
quit:
  message: "QMessage1"
join:
  message: "JMessage2"
quit:
  message: "QMessage2"

要解析所有消息,我所做的只是简单地向每个重复的父键添加数字(join变成join1quit变成{{1 }}, 等等)。由于每个键中都有一个数字,因此可以使用以下正则表达式轻松地将它们还原为只说quit1joinquit在迭代HashMap的for循环中。由于HashMap条目现在在循环中读为str.replaceAll("[^a-zA-Z.]", "").toLowerCase()joinquitjoin,因此可以使用以下代码片段轻松地获取其值:

quit

之后,可以将值添加到ArrayList或其他集合中。就我而言,我使用ArrayList并将YAML文件的属性分配给对象的实例变量。我在项目中的其中一个班级的以下代码片段完成了此任务:

if(entry.equals("join")){
    //Do stuff
}

并不是真的使用HashMaps来允许重复复制,就像我最初要求的那样,但是这个“ hack”对我来说是完美的。希望这可以帮助其他希望这样做的人。