Java 中对象数组的降序选择排序
Descending Selection Sort of Object Array in Java
我目前正在开发一个银行账户程序,该程序接受用户输入并将其输入数组。它执行存款、取款、搜索等操作。我目前无法使用基于每个帐户余额的选择排序。该程序应根据余额从高到低对帐户进行排序,并将结果打印到屏幕上。
这是我第一次使用选择排序,也是我第一次使用数组。我了解选择排序的概念以及如何使用原始值进行排序,但是将其转换为对象值让我很困惑。下面是我用于选择排序的代码。
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 的输出改为输出循环迭代的下一个值。
- 当我 运行 程序时,它只是按照我输入的确切顺序打印银行账户。
在此先感谢您,如果有任何更多信息我可以提供,我很乐意提供。
首先你需要改变这一行
for (j = i; j == BankAccount.getNumberOfAccounts(); j++) {
到
for (j = i; j < BankAccount.getNumberOfAccounts(); j++) {
你现在的方式是说 "loop until j is equal to BankAccount.getNumberOfAccounts()" 而这在这段代码中永远不会发生。
您遇到的另一个性能问题。
BankAccount temp = BankAccounts[i];
BankAccounts[i] = BankAccounts[maxIndex];
BankAccounts[maxIndex] = temp;
想象一下,当前索引已经在正确的位置。你会做一个不必要的 "switch".
例如:当前 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;
}
当您执行 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;
}
在关注了几个旧的相关线程后,我偶然发现了一个完美回答了我的问题的线程。虽然上面提到的 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();
}
这是打印我一直在寻找的结果的代码。我意识到我在内部循环中的比较已关闭,并且我没有为交换创建新数组,只有新对象。感谢大家的帮助!
我目前正在开发一个银行账户程序,该程序接受用户输入并将其输入数组。它执行存款、取款、搜索等操作。我目前无法使用基于每个帐户余额的选择排序。该程序应根据余额从高到低对帐户进行排序,并将结果打印到屏幕上。
这是我第一次使用选择排序,也是我第一次使用数组。我了解选择排序的概念以及如何使用原始值进行排序,但是将其转换为对象值让我很困惑。下面是我用于选择排序的代码。
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 的输出改为输出循环迭代的下一个值。
- 当我 运行 程序时,它只是按照我输入的确切顺序打印银行账户。
在此先感谢您,如果有任何更多信息我可以提供,我很乐意提供。
首先你需要改变这一行
for (j = i; j == BankAccount.getNumberOfAccounts(); j++) {
到
for (j = i; j < BankAccount.getNumberOfAccounts(); j++) {
你现在的方式是说 "loop until j is equal to BankAccount.getNumberOfAccounts()" 而这在这段代码中永远不会发生。
您遇到的另一个性能问题。
BankAccount temp = BankAccounts[i];
BankAccounts[i] = BankAccounts[maxIndex];
BankAccounts[maxIndex] = temp;
想象一下,当前索引已经在正确的位置。你会做一个不必要的 "switch".
例如:当前 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;
}
当您执行 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;
}
在关注了几个旧的相关线程后,我偶然发现了一个完美回答了我的问题的线程。虽然上面提到的 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();
}
这是打印我一直在寻找的结果的代码。我意识到我在内部循环中的比较已关闭,并且我没有为交换创建新数组,只有新对象。感谢大家的帮助!