2016-05-20 6 views
0

Ich erhalte verdoppelt sich von jeder Datei in einem Ordner mitOrganisieren Zahlen vom höchsten zum niedrigsten

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

Er sagt, alle Preise in der Reihenfolge der Dateien, aber ich möchte sie vom höchsten zum niedrigsten Ordnung zu Balance, und was passiert, wenn zwei Spieler den gleichen Betrag haben?

Antwort

1

lesen Sie zunächst alle Inhalte, und speichern sie in einem TreeSet, wie folgt aus:

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

Diese Implementierung Salden in absteigender Reihenfolge der Balance zeigen wird, und, wenn zwei Spieler gleiche Balance haben, in der aufsteigende Reihenfolge ihres Namens, unabhängig vom Fall. Der UUID-Vergleich ist nur ein letzter Ausweg aus der Namenskollision, da ich nicht wirklich weiß, ob Bukkit mehrere Spieler mit Namen erlaubt, die sich nur im Fall unterscheiden.

+0

Danke, dass du mir das gezeigt hast, es hilft mir so sehr! Nur Problem ist in der Balance-Klasse "return d" gibt eine Eklipse Fehler von "kann nicht von Double in int konvertieren" – Kingbluesapphire

+0

Auch in der obersten Klasse in "TreeSet set = new TreeSet <>(). AbsteigendSet();" das "neue TreeSet <>(). absteigendSet();" gibt einen Fehler von "kann nicht von NavigableSet zu TreeSet " konvertieren – Kingbluesapphire

+0

Entschuldigung dafür. Das sollte es beheben ... – glee8e