对包含自定义类的列表进行排序
Posted
技术标签:
【中文标题】对包含自定义类的列表进行排序【英文标题】:Sort a list that contains a custom class 【发布时间】:2012-05-10 22:29:15 【问题描述】:所以我目前正在为大学做一个练习,它有几个可选部分(因为我们还没有在课堂上做过这个),其中一个是使用列表而不是数组(所以它是可变大小的)另一个打印按点排序的列表(我现在会讲到)
所以,我有一个看起来像这样的 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) 之类的东西,但我想这不是我需要的。
谢谢!
【问题讨论】:
你肯定需要Collections.sort
。如果你只需要按分数排序而不需要任何其他条件,那么写public class Player implements Comparable<Player>
并实现所需的方法。
如果你需要评论像variable which contains number of total players
这样简单的东西,你真的需要使用更好的变量名。
也很难推断像int search_Player (String n)
这样的方法做了什么。 Player getPlayerByName(String name)
呢(除非分配明确要求前一个方法签名)?
这是我学会做的,但肯定有更好更简单的方法来做
我还建议使用增强的 for 循环,例如for (Player player : players) ...
而不是基于索引的循环,它更容易理解并且编写的代码更少:)
【参考方案1】:
一种使用 lambdas 的新方法,写起来要短得多
myList.sort((obj1, obj2)->(condition)?1:-1);
您可以将对象用于您的条件,并且返回的任何大于 0 的值都表示交换(在这种情况下,如果条件返回 true)
【讨论】:
【参考方案2】:您可以在Collections
中使用public static <T> void sort(List<T> list, Comparator<? super T> c)
重载 - 提供您需要的比较器(可以只是一个匿名类) - 一切就绪!
编辑: This 描述了该方法的工作原理。简而言之,您将调用实现为
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.
);
就是这样!
【讨论】:
您能详细说明一下吗?这是我第一次用列表做事,我还在习惯它们【参考方案3】:Collections.sort(list)
绝对可以解决您的问题。这是一种对 Java 提供的集合进行排序的方法。如果你正在编写一个“真实世界”的应用程序(不是拼贴练习),这就是你这样做的方式。
要让Collections.sort(list)
工作,你必须实现一个接口调用Comparaple。通过实现此接口,排序将知道如何对您的元素进行排序。
但是因为它是拼贴练习,所以这可能有点容易。如果您想(或必须)实现自己的排序算法,请先尝试对一个常见的数字列表(1、5、2、7...)进行排序。您可以为自己的类轻松扩展这种排序算法。
【讨论】:
不必复杂。正如我所说,我们还没有这样做,可选部分只是为那些在 java 中更高级的人准备的。如果它以某种方式与 Collections.sort(list) 一起工作,那很好!以上是关于对包含自定义类的列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章