组织从最高到最低的数字

时间:2016-05-20 01:40:24

标签: java minecraft bukkit

我使用

从文件夹中的每个文件中获取双打
if(label.equalsIgnoreCase("baltop")){
        if(!(sender instanceof Player)){
            CommandUtils.invalidCommandSender(sender);
            return true;
        }
        File[] files = new File(ServerCore.getPlugin().getDataFolder(), File.separator + "PlayerData").listFiles();
        for(File file : files){
            FileConfiguration playerData = YamlConfiguration.loadConfiguration(file);
            double bal = playerData.getDouble("Money");
            ChatUtils.sendRawMessage(sender, Bukkit.getOfflinePlayer(UUID.fromString(file.getName().replace(".yml", ""))).getName() + ": " + bal);
        }
        return true;
    }

它按文件的顺序显示所有价格,但我想从最高到最低的余额订购它们,如果两个玩家的金额相同,会发生什么?

1 个答案:

答案 0 :(得分:1)

您应首先阅读所有内容,并将它们存储在TreeSet中,如下所示:

if(label.equalsIgnoreCase("baltop")){
    if(!(sender instanceof Player)){
        CommandUtils.invalidCommandSender(sender);
        return true;
    }
    TreeSet<Balance> set = new TreeSet<>();
    set = set.descendingSet();
    File[] files = new File(ServerCore.getPlugin().getDataFolder(), File.separator + "PlayerData").listFiles();
    for (File file : files){
        FileConfiguration playerData = YamlConfiguration.loadConfiguration(file);
        double bal = playerData.getDouble("Money");
        UUID uuid = UUID.fromString(file.getName().replace(".yml", ""));
        set.add(new Balance( Bukkit.getOfflinePlayer(uuid).getName(), uuid, bal));
    }

    for (Balance b : set) {
        ChatUtils.sendRawMessage(sender, b.name + ": " + b.balance);
    }
    return true;
}

private static class Balance implements Comparable<Balance> {
    public String name;
    public UUID uuid;
    public double balance;
    public Balance(String n, UUID u, double b) {
        name = n;
        uuid = u;
        balance = b;
    }
    @Override
    public int compareTo(Balance b) {
        double d = balance - b.balance;
        if (d<-0.001||d>0.001)
            return (int) Math.signum(d);

        int e = -name.compareToIgnoreCase(b.name);
        if (e != 0)
            return e;
        return -uuid.compareTo(b.uuid);
    }
}

此实施将按余额的降序显示余额,如果两个玩家具有相同的余额,则按其名称的升序显示,无论情况如何。 UUID比较只是名称冲突的最后手段,因为我不知道bukkit是否允许多名玩家的名字只有不同的情况。