Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort a list that contains a custom class

so I'm currently doing an exercise for college that has several optional parts (because we havn't done this in class yet), one of them being to use lists instead of arrays (so it'd be variable size) and another one printing the list sorted by points (I'll get to that now)

So, I have the Player.java class which looks like this.

public class Player {
    String name;
    String password;
    int chips;
    int points;

    public Player(String n, String pw, int c, int p) {
        name = n;
        password = pw;
        chips = c;
        points = p;
    }

    public String getName() {
        return name;
    }

    public void setName(String n) {
        name = n;
    }

    public void setPW(String pw) {
        password = pw;
    }

    public String getPW() {
        return password;
    }

    public void setChips(int c) {
        chips = c;
    }

    public int getChips() {
        return chips;
    }

    public void setPoints(int p) {
        points = p;
    }

    public int getPoints() {
        return points;
    }
}

Pretty simple, then I'm creating a List with this (in another class):

List<Player> lplayer = new ArrayList<Player>(); 

Adding players with this:

lplayer.add(new Player(n,pw,c,p))`

And finally reading their stats with this:

public int search_Player (String n) {
    String name;
    int i = 0;
    boolean found = false;
    while ((i <= tp) && (!found)) {
        name = lplayer.get(i).getName();
        if (name.equals(n)) {
            found = true;
        }
        i++;
    }
    return (found == true) ? i-1 : -1;
}
public Player show_Player (int i) {
    return lplayer.get(i);
}
public void list_Players() {
    Collections.sort(lplayer);
    int i2;
    if (tp > 0) { // variable which contains number of total players
        for (int i = 0;i<tp;i++) {
            i2 = i+1;
            System.out.println ("\n"+i2+". "+lplayer.get(i).getName()+" [CHIPS: "+lplayer.get(i).getChips()+" - POINTS: "+lplayer.get(i).getPoints()+"]");
        }
    }
    else {
        System.out.println ("There are no players yet.");
    }
}

So that's basically all the code. As you can see the I already have a list_Players function but that just prints it in the order it was added. I need a way to print in sorted by the points each player has (so basically a ranking).

As you can see I'm pretty new to java so please try not to come up with a very complicated way of doing it.

I've already searched for it and found things like Collections.sort(list) but I guess that's not what I need right here.

Thank you!

like image 482
zaakun Avatar asked May 01 '12 11:05

zaakun


2 Answers

You can use the public static <T> void sort(List<T> list, Comparator<? super T> c) overload in Collections - provide the comparator you need (can be just an anonymous class) - and you are all set!

EDIT: This describes how the method works. In brief, you'll implement your call as

Collections.sort(list, new Comparator<Player>() {
    int compare(Player left, Player right)  {
        return left.getPoints() - right.getPoints(); // The order depends on the direction of sorting.
    }
});

That's it!

like image 68
Alexander Pavlov Avatar answered Oct 14 '22 05:10

Alexander Pavlov


Collections.sort(list) could definitely by a solution for your problem. It's a way to sort your collections provided by Java. If you are writing a "real world" application (not an exercise for collage) this would be the way you doing it.

To let Collections.sort(list) works, you have to implement an interface call Comparaple. By implementing this interface, the sort will know how to order your elements.

But because it's a exercise for collage, this is perhaps a little bit to easy. If you want (or must) implement you own sorting algorithm, try first to sort a common list of numbers (1, 5, 2, 7...). You can extend such an sorting algorithm easily for your own classes.

like image 1
Thomas Uhrig Avatar answered Oct 14 '22 06:10

Thomas Uhrig