我正在使用以下方法从文件夹中的每个文件中获取双打
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是否允许多个玩家使用大小写不同的名称。