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

时间:2016-08-12 19:18:06

标签: java bukkit

我很想知道如何保存和加载两个HashMaps,我一直在尝试使用我自己的方法,但我无法解决任何问题,因为一个人会覆盖另一个!

这是我的Main.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;
}
}

这是我的Sub.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 个答案:

答案 0 :(得分:0)

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

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

此方法

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

先后致电sub.savePoints()sub.saveCommandUsed()

所以,当你这样做时

 plugin.getConfig().set(pointstostore.getKey(), pointstostore.getValue());
<{1>}和

中的

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

中的

第一次,你编写了最终存储在`plugin()。getConfig()中的键值。
第二次覆盖它们。