1.11 Java Spigot/Bukkit 编程 - 将 HashMap 保存/加载到 Config.yml

1.11 Java Spigot/Bukkit programming - Save / Load HashMap into Config.yml

我在 HashMap 中为每个玩家计算了一个分数:

    public Map<String, Integer> PScore = new HashMap<String, Integer>();

现在我想在 Config.yml 中保存和加载 HashMap。该配置已存在并且正在用于其他变量。

这是我解决问题的多次尝试:

public void saveHash()
{
     for (String string : PScore.keySet()) 
     {
         this.getConfig().set("score.pscore", string);
         this.saveConfig();
     }
}

public void loadHash() 
{
}

但在配置中我只得到:

score:
 pscore: JackerNils

加载函数是空的,所以加载时当然没有任何反应。保存和加载功能由 onEnable() 和 onDisable()

控制

//编辑:

    public Map<String, Integer> PScore = new HashMap<String, Integer>();

public void saveHash()
{
     List<String> s = this.getConfig().getStringList("PScore");

     for(String str : PScore.keySet())
     {
         s.add(str +  ":" + PScore.get(str));
     }
     this.getConfig().set("PScore", s);
     this.saveConfig();
}

public void loadHash() 
{
     List<String> s = this.getConfig().getStringList("PScore");

     for(String str: s)
     {
         String words[] = str.split(":");
         PScore.put(words[0], Integer.parseInt(words[1]));
     }
}

这个方法现在工作正常,但看看配置做了什么:

PScore:
 - JackerNils:5
 - JackerNils:19

所以你看到了吗?它没有覆盖它,而是重复。

问题是 saveConfig,它所做的是在每次循环执行后保存并覆盖您正在执行的当前文件,导致在循环完成后仅保存 hashmap 中的一个值。您可以做的是在设置所有值后保存配置,如下所示:

for (String string : PScore.keySet()) 
    {
        this.getConfig().set("score.pscore", string);
    }
this.saveConfig();

另请记住,您要将所有值添加到配置中的同一部分。改为保存一个数组。