Java中对象数组的降序选择排序

时间:2015-11-29 16:54:34

标签: java arrays sorting selection-sort

我目前正在开发一个银行账户程序,该程序接受用户输入并将其输入数组。它执行诸如存款,取款,搜索等操作。我目前正在使用基于每个账户中的余额金额的选择排序。该程序应根据从最高到最低的平衡对帐户进行排序,并将结果打印到屏幕上。

这是我第一次使用选择排序和前几次使用数组之一。我理解选择排序的概念以及如何使用原始值进行操作,但将其转换为对象值却让我感到困惑。下面是我选择排序的代码。

if (out.equals("Sort")) {
    int i, j, maxIndex;
    double maxValue;

    //getNumberOfAccounts is a static counter incremented each time 
    //a new bank account is created
    for (i = 0; i < BankAccount.getNumberOfAccounts(); i++) { 
        //Sets first value as largest
        maxValue = BankAccounts[i].getBalance(); 
        maxIndex = i; //Index of first value

        for (j = i; j == BankAccount.getNumberOfAccounts(); j++) {
            //Compares subsequent values to initial max value
            if (BankAccounts[j].getBalance() > maxValue) { 
                maxValue = BankAccounts[j].getBalance();
                maxIndex = j;
            }
        }

        //Attempts to swap values
        BankAccount temp = BankAccounts[i];
        BankAccounts[i] = BankAccounts[maxIndex];
        BankAccounts[maxIndex] = temp;
        //Outputs Bank Account data in descending order based on balance
        BankAccounts[maxIndex].printReport();
    }
}

注意:
- 这是整个程序的一部分,所以如果我错过了一个括号,那只是因为我没有复制整个程序。
- 当我运行程序时,它似乎不存储maxValue; maxValue的输出改为输出下一个循环迭代的值。
- 当我运行程序时,它只是按照我输入的确切顺序打印银行账户。

提前感谢您,如果我能提供更多信息,我很乐意提供。

3 个答案:

答案 0 :(得分:1)

首先你需要改变这一行

for (j = i; j == BankAccount.getNumberOfAccounts(); j++) {

for (j = i; j < BankAccount.getNumberOfAccounts(); j++) {

你现在拥有它的方式你说“循环直到j等于BankAccount.getNumberOfAccounts()”并且这个代码永远不会发生。

您遇到的另一个性能问题。

BankAccount temp = BankAccounts[i];
BankAccounts[i] = BankAccounts[maxIndex];
BankAccounts[maxIndex] = temp;

Imagen当前索引已经在正确的位置。您将进行不必要的“切换”。

例如:当前intex(i == 5)最大余额位置(maxIndex == 5)。

你将拥有:

BankAccount temp = BankAccounts[5];
BankAccounts[5] = BankAccounts[5];
BankAccounts[5] = temp;

所以你可以把这个部分改成这个:

if(i != maxIndex) {
    //Attempts to swap values
    BankAccount temp = BankAccounts[i];
    BankAccounts[i] = BankAccounts[maxIndex];
    BankAccounts[maxIndex] = temp;
}

答案 1 :(得分:1)

当您执行BankAccounts[maxIndex].printReport();时,您已经交换了这些值。因此,您要在maxIndex位置打印该值,并且当前步骤开始时已有位于i位置的项目。

因此,您需要在交换之前执行BankAccounts[maxIndex].printReport();,或者从正确的位置打印值 - BankAccounts[i].printReport();

关于maxValue - 它会更新每个步骤,因此如果您在周期结束后需要这个,那么您可以在排序例程结束后将其设为BankAccounts[0].getBalance()

此外,如果您只需要对项目进行排序,但是您并不依赖于使用选择排序,我建议使用Java内置方法进行排序,因此您的代码应如下所示:

Arrays.sort(BankAccounts, 0, BankAccount.getNumberOfAccounts(), new Comparator<BankAccount>() {
        @Override
        public int compare(BankAccount o1, BankAccount o2) {
            if (o1.getBalance() > o2.getBalance()) return -1;
            if (o1.getBalance() < o2.getBalance()) return 1;
            return 0;
        }
    }
);

在此排序操作之后,数组BankAccounts按照余额的降序排序,您只需在一个简单的循环中打印报告:

for (i = 0; i < BankAccount.getNumberOfAccounts(); i++) { 
    BankAccounts[i].printReport;
}

答案 2 :(得分:1)

在跟踪了几个旧的相关主题之后,我偶然发现了一个完全回答我问题的主题。虽然上面提到的Array.sort方法工作得很好,但我还是很不舒服,因为我还没有了解它。

            if (out.equals("Sort")){


            for (int i = 0; i < BankAccount.getNumberOfAccounts(); i++){
                for(int j = i+1; j < BankAccount.getNumberOfAccounts(); j++){
                    if(BankAccounts[j].getBalance() > BankAccounts[i].getBalance()){
                        BankAccount [] temp = new BankAccount [BankAccounts.length];
                        temp [j] = BankAccounts [j];
                        BankAccounts [j] = BankAccounts [i];
                        BankAccounts [i] = temp [j]; 
                    }
                }
            }

            for (int i = 0; i < BankAccount.getNumberOfAccounts(); i++){
                BankAccounts[i].printReport();
                System.out.println();
            }

这是打印我一直在寻找的结果的代码。我意识到我在内部循环中的比较是关闭的,我没有为交换创建一个新数组,只有新对象。谢谢你的帮助!