当前位置: 首页 > 知识库问答 >
问题:

在同一文件中保存/加载两个HashMap

孔才
2023-03-14

我很想知道如何保存和加载两个HashMaps,我一直在尝试使用自己的方法,但我什么都想不通,因为一个正在覆盖另一个!

这是我的主要.class

package me.core.UPTest;

import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{

public final Sub sub = new Sub(this);

public void onEnable(){
    getLogger().info("Ultimate Plugin is now enabled.");
    getServer().getPluginManager().registerEvents(sub, this);
    sub.loadPoints();
    sub.loadCommandUsed
}

public void onDisable(){
    getLogger().info("Ultimate Plugin is now disabled.");
    sub.savePoints();
    sub.saveCommandUsed();
}
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){

    Player player = (Player) sender;

    if(cmd.getName().equalsIgnoreCase("points")){
        if(args.length == 0){
            player.sendMessage("You have " + sub.points.get(player.getName().toLowerCase()) + " points.");
            return true;

        }else if(args.length > 0){
            player.sendMessage(ChatColor.GRAY + "Too many arguments.");
            return true;
        }
    }

    if(cmd.getName().equalsIgnoreCase("vote")){
        if(args.length == 0){
            if(sub.commandused.get(player.getName().toLowerCase()) == false){
                player.sendMessage(ChatColor.BLUE + "Thank you for voting for our server!");
                sub.commandused.put(player.getName().toLowerCase(), true);
                return true;

            }else{
                player.sendMessage(ChatColor.BLUE + "You have already voted for our server!");
            }

        }else if(args.length > 0){
            player.sendMessage(ChatColor.GRAY + "Too many arguments.");
            return true;
        }
    }

    return false;
}
}

这是我的潜艇.class

package me.core.UPTest;

import java.util.HashMap;
import java.util.Map.Entry;

public class Sub {

private Main plugin;

public Sub(Main plugin) {
    this.plugin = plugin;
}

private HashMap<String, Integer> points = new HashMap<String, Integer>();
private HashMap<String, Boolean> commandused = new HashMap<String, Boolean>();

public void loadPoints(){
    for (String str : plugin.getConfig().getKeys(true)) {
        int p = plugin.getConfig().getInt(str);
        points.put(str, p);
    }
    plugin.saveConfig();
}

public void savePoints(){
    for (Entry<String, Integer> pointstostore : points.entrySet()) {
        plugin.getConfig().set(pointstostore.getKey(), pointstostore.getValue());
    }
    plugin.saveConfig();
}

public void loadCommandUsed(){
    for (String str : plugin.getConfig().getKeys(true)){
        boolean p = plugin.getConfig().getBoolean(str);
        commandused.put(str, p);
    }
    plugin.saveConfig();
}

public void saveCommandUsed(){
    for (Entry<String, Boolean> commandusedtostore : commandused.entrySet()){
        plugin.getConfig().set(commandusedtostore.getKey(), commandusedtostore.getValue());
    }
    plugin.saveConfig();
}
    @EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
    Player player = event.getPlayer();

    if(points.get(player.getName().toLowerCase()) == null){
        points.put(player.getName().toLowerCase(), 0);
    }
    commandused.put(player.getName().toLowerCase(), false);
}
}

正如我在一开始提到的,地图会互相覆盖,我不知道如何解决这个问题!

共有1个答案

阎卓
2023-03-14

1)为什么在加载方法中编写plugin.saveConfig()?这里不应该需要它。

2) commandusedmaps使用相同的键。我不明白你为什么有两张地图。一个就够了。

此方法

public void onDisable(){
    getLogger().info("Ultimate Plugin is now disabled.");
    sub.savePoints();
    sub.saveCommandUsed();
}

依次调用子.savePoints()子.save命令使用()

所以,当你这么做的时候

 plugin.getConfig().set(pointstostore.getKey(), pointstostore.getValue());

保存命令使用()

plugin.getConfig().set(commandusedtostore.getKey(),commandusedtostore.getValue());

在< code >保存点()中

第一次,您编写最终存储在` plugin()中的键值。getConfig()。< br >第二次覆盖它们时。

 类似资料:
  • 问题内容: 我有一堂课,为游戏中的玩家提供服务,创建他们以及其他东西。 我需要将这些播放器对象保存在文件中,以便以后使用。我已经尝试过pickle模块,但是我不知道如何保存多个对象并再次加载它们?有没有办法做到这一点,还是应该使用其他类(例如列表)并将对象保存并加载到列表中? 有没有更好的办法? 问题答案: 到目前为止,使用列表,元组或字典是最常见的方法: 打印: 但是,泡菜文件 可以 包含任意数

  • 问题内容: 我有一堂课,为游戏中的玩家提供服务,创建他们以及其他东西。 我需要将这些播放器对象保存在文件中,以便以后使用。我已经尝试过pickle模块,但是我不知道如何保存多个对象并再次加载它们?有没有办法做到这一点,还是应该使用其他类(例如列表)并将对象保存并加载到列表中? 有没有更好的办法? 问题答案: 到目前为止,使用列表,元组或字典是最常见的方法: 输出: 但是,泡菜文件可以包含任意数量的

  • 问题内容: 从到目前为止的经验来看,有几种不同的方法可以将TensorFlow图转储到文件中,然后再将其加载到另一个程序中,但是我无法找到关于它们如何工作的清晰示例/信息。我已经知道的是: 使用a将模型的变量保存到检查点文件(.ckpt)中,并在以后还原它们(源) 将模型保存到.pb文件,然后使用和(source)将其加载回 从.pb文件加载模型,对其进行重新训练,然后使用Bazel将其转储到新的

  • 问题内容: 我使用的不是可重入的库(用C编写)(即库中没有函数可重入)。假设我已经通过System.load加载了库以获取句柄“ v”。由于重入问题(尝试过但无意义的结果),我无法在两个线程中使用v。我可以使用锁,但这会破坏我本可以获得的任何并行性。 我想做的是启动两个线程,然后在每个线程中加载库以获取两个不同的句柄(因此,加载的库有两个副本)。 这在Java中可行吗?问候Saptarshi 问题

  • 问题 在本机硬盘上有一个HTML文件,需要对它进行解析从中抽取数据或进行修改。 办法 可以使用静态Jsoup.parse(File in, String charsetName, String baseUri) 方法: File input = new File("/tmp/input.html"); Document doc = Jsoup.parse(input, "UTF-8", "http

  • 我正在生成。Liferay portlet中的svg文件将保存在服务器(JBoss AS)上的svg文件夹中。这些文件生成并保存在中。java类,如下所示: 该文件保存在server/bin/svg目录中。但是当我试图访问我的数据库中的文件时。jsp页面,它似乎找不到文件(可能正在另一个目录中查找)。我怎样才能告诉它,所需的文件在哪里?我可以使用绝对路径,将其存储在某个位置并将其传递给。jsp页面