如何从YAML中获取有序HashMap?

5

我试图从我的config.yml文件中检索一个Map,但无法找到保留先前设置的键顺序的方法。

classes:
 beginner: 1000
 proplayer: 2000
 admin: 5000

我知道classes的键集会得到一个Map,但顺序不是按照显示的顺序。

我需要它按顺序排列,因为这是玩家将升级到的课程顺序。所以如果他是初学者,他需要升级到职业球员,等等。

我需要某种方法来解决这个问题,以便我可以得到初学者在索引0上,以便猜测玩家将要移动到哪个课程,例如,在这种情况下移动到职业球员(索引1),但我还需要检索课程的int值,以便从他正在移动的课程向玩家收取费用。


2
请发布一些Java代码,以便我们了解为什么您需要顺序。Map不是有序的。 - Sanjay Manohar
我需要它按顺序排列,因为玩家将按照yml上的顺序从一个班级升级到另一个班级,所以我需要从初学者升级到专业选手,而不是随机升级。 - LeoColman
你尝试使用列表了吗?例如,以减号“-beginner”开头的行。 - Sanjay Manohar
3个回答

4
YAML中可以这样指定有序映射:
classes: !!omap
  - beginner: 1000
  - proplayer: 2000
  - admin: 5000

请查看YAML规范中的“例2.26。有序映射”(1.0, 1.11.2)。请注意,您的YAML解析器不一定支持此功能,但很可能会支持(SnakeYAML支持此功能)。实际使用的类型也取决于您的YAML解析器,但应该映射到语言中最自然的有序映射类型。

1

Map的实现不关心条目的顺序。

因此,在使用该classes层次结构轻松检索每个值时,我会创建一个并行列表来跟踪它们的顺序。

classes:
  order:
  - beginner
  - proplayer
  - admin
  cost:
    beginner: 1000
    proplayer: 2000
    admin: 5000

List<String> orderedList = data.getStringList("classes.order");
String item = orderedList.get(0);
int cost = data.getInt("classes.cost." + item);

0

简而言之,使用列表?

classes:
  - beginner: 1000
  - proplayer: 2000
  - admin: 5000 

阅读它:我认为这里已经有答案了: 如何在yaml中读取列表?

列表项不是键。您无法分配值。 - spongebob
这实际上是一个地图列表。那是允许的,不是吗? - Sanjay Manohar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接