我正在使用以下方法从文件夹中的每个文件中获取双打

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;
    }


它说了所有价格按文件顺序排列,但我想按最高到最低余额顺序排列,如果两个播放器的数量相同,会发生什么?

最佳答案

您应该首先阅读所有内容,并将其存储在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是否允许多个玩家使用大小写不同的名称。

07-27 13:34