如何解决我的排序方法,以便获得名称的字母顺序

时间:2019-04-03 02:29:33

标签: java

我正在尝试修复我的排序方法。我正在从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

2 个答案:

答案 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));
}