我正在尝试修复我的排序方法。我正在从txt文件读取内容,并尝试按字母顺序获取它们。
我不能使用具有可比性的工具,而不能使用collections.sort(),因为我的教练不允许这样做。
//How I am trying to sort
public static void sortPlayers(ArrayList<BingoPlayer> players){
BingoPlayer temp;
int value = 0;
for(int i = 0; i < players.size()-1; i++)
{
value = compareTo(players.get(i), players.get(i + 1));
if(value < 0 || value == 0){
//continue;
}
else if(value > 0){
temp = players.get(i);
players.set(i, players.get(i + 1));
players.set(i + 1, temp);
}
}
}
//How am I comparing.
public static int compareTo(BingoPlayer player1, BingoPlayer player2){
if(player1.firstName.compareTo(player2.firstName) < 0)
return player1.firstName.compareTo((player2.firstName));
else if(player1.firstName.compareTo(player2.firstName) > 0)
return player1.firstName.compareTo((player2.firstName));
else
if (player1.lastName.compareTo(player2.lastName) < 0)
return player1.lastName.compareTo((player2.lastName));
else if (player1.lastName.compareTo(player2.lastName) > 0)
return player1.lastName.compareTo((player2.lastName));
else
return 0;
}
这是我正在阅读的txt文件:
50.00
10
James,Smith,50.0
Michael,Smith,50.0
Robert,Smith,50.0
Maria,Garcia,50.0
David,Smith,50.0
Maria,Rodriguez,50.0
Mary,Smith,50.0
Maria,Hernandez,50.0
Maria,Martinez,50.0
James,Johnson,50.0
答案 0 :(得分:1)
不允许您使用,但对于任何阅读者:排序是Java内置的,您无需自己实现。
Collections.sort(玩家,
Comparator.comparing(BingoPlayer :: getFirstName)
.thenComparing(BingoPlayer.getLastName));
这将需要您在宾果游戏玩家类中实现吸气剂,无论如何这都是很好的样式。 PS,我还没有测试过,请原谅我有错字。
如果列表顺序不正确,则您将通过一遍交换相邻的球员。由于玛丽亚·加西亚(Maria Garcia)已经在罗伯特·史密斯(Robert Smith)身边,因此他们将排在他们之前,但是这并不能解决列表中距离较远的所有球员的情况。例如,詹姆斯·约翰逊(James Johnson)将不会升任以J开头的其他玩家。
您尝试做的事情使人联想起气泡排序算法,但是要用作气泡排序,您需要在列表上重复遍历,直到不再进行交换为止。
PS在方法命名上:通常,宾果游戏播放器类中的一个实例方法(非静态方法)将该宾果游戏播放器与另一个宾果播放器进行比较,这将被称为 compareTo
,而将两个玩家作为参数的方法并将它们进行比较称为 compare
。因此,将前一种名称用于后一种方法可能会使某些方法感到困惑。
答案 1 :(得分:1)
您需要使用nested for loop
进行排序
public static void sortPlayers(ArrayList<BingoPlayer> players){
BingoPlayer temp;
int value = 0;
for(int i = 1; i <= players.size()-1; i++)
{
for(int j=i;j>0;j--){
value = compareTo(players.get(j), players.get(j - 1));
if(value < 0){
temp = players.get(j);
players.set(j, players.get(j - 1));
players.set(j - 1, temp);
}
}
}
}
我还对您的比较功能进行了一些优化:
public static int compareTo(BingoPlayer player1, BingoPlayer player2){
if(player1.firstName.compareTo(player2.firstName) != 0)
return player1.firstName.compareTo((player2.firstName));
else
return player1.lastName.compareTo((player2.lastName));
}