6

所以我目前正在为大学做一个练习,它有几个可选部分(因为我们还没有在课堂上做过这个),其中一个是使用列表而不是数组(所以它是可变大小)和另一个打印按点排序的列表(我现在会谈到)

所以,我有一个看起来像这样的 Player.java 类。

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

很简单,然后我用这个(在另一个类中)创建一个列表:

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

添加玩家:

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

最后阅读他们的统计数据:

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

所以这基本上是所有的代码。如您所见,我已经有一个 list_Players 函数,但它只是按照添加的顺序打印它。我需要一种按每个玩家的得分排序的方法(所以基本上是一个排名)。

如您所见,我对 java 很陌生,所以请尽量不要想出一种非常复杂的方法。

我已经搜索过它并找到了 Collections.sort(list) 之类的东西,但我想这不是我需要的。

谢谢!

4

3 回答 3

7

您可以使用public static <T> void sort(List<T> list, Comparator<? super T> c)重载Collections- 提供您需要的比较器(可以只是一个匿名类) - 一切就绪!

编辑描述了该方法的工作原理。简而言之,您将调用实现为

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

而已!

于 2012-05-01T11:27:51.750 回答
1

Collections.sort(list)绝对可以解决您的问题。这是一种对 Java 提供的集合进行排序的方法。如果你正在编写一个“真实世界”的应用程序(不是拼贴练习),这就是你这样做的方式。

为了让Collections.sort(list)工作,你必须实现一个接口调用Comparaple。通过实现此接口,排序将知道如何对您的元素进行排序。

但是因为它是拼贴的练习,所以这可能有点容易。如果您想(或必须)实现自己的排序算法,请先尝试对一个常见的数字列表(1、5、2、7...)进行排序。您可以为自己的类轻松扩展这种排序算法。

于 2012-05-01T11:30:01.250 回答
0

一种使用 lambdas 的新方法,写起来要短得多是

myList.sort((obj1, obj2)->(condition)?1:-1);

您可以在其中使用对象来满足您的条件,并且返回的任何大于 0 的值都表示交换(在这种情况下,如果条件返回 true)

于 2021-01-16T11:13:08.673 回答