Sorting Strings by Integers (Toplist)

Discussion in 'Plugin Development' started by Schulzi, Jul 12, 2012.

Thread Status:
Not open for further replies.
  1. Offline

    Schulzi

    Hey guys! I have a really big problem :(. I want to sort strings by integers. But I have really no plan how to do this. I have googled many threads. Found some functions like Comparator. But I don't know how to work with it with my script. I want to have a top 10 list in my plugin, where you can see the top levels of the players. Well, from highest level to the lowest. But I also want to get the int(player's level) from the config file.
    Here my scripts:
    How I save the levels to the config:
    Code:
    this.config.getAccountsConfig().options().header("Player accounts");
            this.config.getAccountsConfig().addDefault(player.getName() + ".Level", player.getLevel());
            this.config.getAccountsConfig().options().copyDefaults(true);
            this.config.saveAccountsConfig();
    This just works fine.
    And my toplist script:
    Code:
    else if(args[0].equalsIgnoreCase("top")) {
                            if(player.hasPermission("xpm.top")) {
                                Player[] users = this.getServer().getOnlinePlayers();
                               
                                player.sendMessage(ChatColor.DARK_GRAY + "---------- " + ChatColor.GOLD + "Xp Management" + ChatColor.DARK_GRAY + ": " + ChatColor.DARK_AQUA + "Top list " + ChatColor.DARK_GRAY + "----------");
                               
                                for(int n = 0; n < users.length; n++) {
                                    int pos = n + 1;
                                                                   
                                    player.sendMessage(ChatColor.DARK_GRAY + "[" + ChatColor.GOLD + pdFile.getName() + ChatColor.DARK_GRAY + "] " + ChatColor.DARK_GREEN + pos + ". " + ChatColor.DARK_GRAY + users[n].getName() + ChatColor.GOLD + ": " + ChatColor.DARK_GREEN + "Level " + ChatColor.WHITE + users[n].getLevel());
                                }                           
                               
                                return true;
                            } else {
                                player.sendMessage(ChatColor.DARK_GRAY + "[" + ChatColor.GOLD + pdFile.getName() + ChatColor.DARK_GRAY + "] " + ChatColor.RED + "Error: You do not have permission to perform this command!");
                               
                                return true;
                            }
                        }
    For now I have tested it with getOnlinePlayers(). This works fine, too, but not sorted from highest to lowest.
    I would be so happy, if someone know how to create such sorting functions.
    Thanks!
     
  2. I also needed something like this in the past, this was my solutioon, mayby you can chance it to fit your own use it was part of an custom eggroulette plugin)
    Code:java
    1.  
    2. Map<String, Integer> winners;
    3. SortedSet<PlayerDataComparable> players = new TreeSet<PlayerDataComparable>();
    4. for (Map.Entry<String, Integer> i : winners.entrySet())
    5. {
    6. players.add(new PlayerDataComparable(i.getKey(), i.getValue()));
    7. // ...
    8. }
    9.  
    10.  
    11. //print list:
    12. Iterator<PlayerDataComparable> i = players.iterator();
    13. int counter = 0;
    14. while (i.hasNext() && counter < ChatPaginator.CLOSED_CHAT_PAGE_HEIGHT)
    15. {
    16. PlayerDataComparable next = i.next();
    17. // broadcastMessage("Congrats " + next.getPlayer() + " for winning " + moneyFormat(next.getPrize()) + " at the place '" + name + "'");
    18. counter++;
    19. }
     
  3. Offline

    Schulzi

    Ok. Will try my best. Thanks!
    But what to write in the PlayerDataComparable class?
     
  4. Offline

    Schulzi

    Nobody? :(
     
  5. sorry, it was just late yesterday, I try to give you again the examply, whit al the things I used
    Code:java
    1. Map<String, Integer> winners;
    2. SortedSet<PlayerDataComparable> players = new TreeSet<PlayerDataComparable>();
    3. for (Map.Entry<String, Integer> i : winners.entrySet())
    4. {
    5. players.add(new PlayerDataComparable(i.getKey(), i.getValue()));
    6. // ...
    7. }
    8.  
    9.  
    10. //print list:
    11. Iterator<PlayerDataComparable> i = players.iterator();
    12. int counter = 0;
    13. while (i.hasNext() && counter < ChatPaginator.CLOSED_CHAT_PAGE_HEIGHT)
    14. {
    15. PlayerDataComparable next = i.next();
    16. // broadcastMessage("Congrats " + next.getPlayer() + " for winning " + moneyFormat(next.getPrize()) + " at the place '" + name + "'");
    17. counter++;
    18. }
    Code:java
    1. public final class PlayerDataComparable implements Comparable<PlayerDataComparable>, Cloneable, java.io.Serializable
    2. {
    3. private static final long serialVersionUID = 123456L;
    4. private final String player;
    5. private final int prize;
    6.  
    7. public PlayerDataComparable(String player, int prize)
    8. {
    9. this.player = player;
    10. this.prize = prize;
    11. }
    12.  
    13. @Override
    14. public int compareTo(PlayerDataComparable o)
    15. {
    16. if (o.prize > this.prize)
    17. {
    18. return -1;
    19. }
    20. if (o.prize < this.prize)
    21. {
    22. return 1;
    23. }
    24. return String.CASE_INSENSITIVE_ORDER.compare(this.player, o.player);
    25. }
    26.  
    27. @Override
    28. public boolean equals(Object obj)
    29. {
    30. if (obj == null)
    31. {
    32. return false;
    33. }
    34. if (getClass() != obj.getClass())
    35. {
    36. return false;
    37. }
    38. final PlayerDataComparable other = (PlayerDataComparable) obj;
    39. if ((this.player == null) ? (other.player != null) : !this.player.equals(other.player))
    40. {
    41. return false;
    42. }
    43. if (this.prize != other.prize)
    44. {
    45. return false;
    46. }
    47. return true;
    48. }
    49.  
    50. @Override
    51. public int hashCode()
    52. {
    53. return this.player.hashCode() ^ this.prize;
    54. }
    55.  
    56. @Override
    57. public String toString()
    58. {
    59. return "PlayerDataComparable{"
    60. + "player=" + player
    61. + ", prize=" + prize
    62. + '}';
    63. }
    64.  
    65. @Override
    66. public PlayerDataComparable clone() throws CloneNotSupportedException
    67. {
    68. return (PlayerDataComparable)super.clone();
    69. }
    70.  
    71. public String getPlayer()
    72. {
    73. return player;
    74. }
    75.  
    76. public int getPrize()
    77. {
    78. return prize;
    79. }
    80. }
     
  6. Offline

    Schulzi

    Got it working now on my own way :)
    How? First I created a new class which implements a Comparable:
    Code:
    public class User implements Comparable<Object> {
        private String name = "";
        private int level = 0;
     
        public User(String name, int level) {
            this.name = name;
            this.level = level;
        }
       
        public String getName() {
            return name;
        }
       
        public int getLevel() {
            return level;       
        }
     
        @Override
        public int compareTo(Object s) {
            User p = (User) s;
            if(level < p.getLevel()) {
                return -1;
            } else if(level == p.getLevel()) {
                return 0;
            }
            return 1;
        }
       
        /*public static void main(String[] s) {
            User[] toSort = new User[5];
            toSort[0] = new User("A",34,1);
            toSort[1] = new User("B",5,2);
            toSort[2] = new User("C",67,3);
            toSort[3] = new User("D",1,4);
            toSort[4] = new User("F",10,5);
           
            System.out.println("Vor dem Sortieren");
            for (User p : toSort){
                System.out.println("Name: " + p.getName() + ", Punkte: " + p.getLevel());
            }
            Arrays.sort(toSort, Collections.reverseOrder());
           
            System.out.println("Nach dem Sortieren");
            for (User p : toSort){
                System.out.println("Name: " + p.getName() + ", Punkte: " + p.getLevel());
            }
        }*/
     
    }
    And here how I used it in the onCommand:
    Code:
    else if(args[0].equalsIgnoreCase("top")) {
                            if(player.hasPermission("xpm.top")) {
                                Player[] players = this.getServer().getOnlinePlayers();
                                User[] users = new User[players.length];
                               
                                player.sendMessage(ChatColor.GRAY + "---------- " + ChatColor.GOLD + "Xp Management" + ChatColor.GRAY + ": " + ChatColor.DARK_AQUA + "Top list " + ChatColor.GRAY + "----------");
                               
                                for(int i = 0; i < players.length; i++) {                               
                                    users[i] = new User(players[i].getName(),players[i].getLevel());
                                }
                                Arrays.sort(users, Collections.reverseOrder());
                                for(User u : users) {
                                    int pos = this.position;
                                   
                                    player.sendMessage(ChatColor.GRAY + "[" + ChatColor.GOLD + pdFile.getName() + ChatColor.GRAY + "] " + ChatColor.DARK_GREEN + pos + ". " + ChatColor.GRAY + u.getName() + ChatColor.GOLD + ": " + ChatColor.DARK_GREEN + "Level " + ChatColor.WHITE + u.getLevel());
                                   
                                    this.position = pos + 1;
                                }
                                this.position = 1;
                               
                                return true;
                            } else {
                                player.sendMessage(ChatColor.GRAY + "[" + ChatColor.GOLD + pdFile.getName() + ChatColor.GRAY + "] " + ChatColor.RED + "Error: You do not have permission to perform this command!");
                               
                                return true;
                            }
                        }
    Also created a "private int position = 1;" to set the position in the top list.
    But thanks for your help ferrybig ;)
     
Thread Status:
Not open for further replies.

Share This Page