我正在尝试对银行账户进行排序,首先按照姓名的字母顺序进行排序,然后按照账户中的金额从多到少进行排序。不幸的是,CompareTo方法似乎不能正常工作,唯一有效的部分是第二部分,它按金额排序。
银行帐户类
/**
* A bank account has a balance, the name of the account holder,
* and an account number. The balance can be changed by deposits
* and withdrawals.
*/
public class BankAccount implements Comparable<BankAccount> {
/**
* Constructs a bank account with a zero balance.
* @param name the name of the account holder
*/
public BankAccount(String name) {
this.name = name;
balance = 0;
accountNo = ++lastAccountNo;
}
/**
* Constructs a bank account with a given balance.
* @param initialBalance the initial balance
* @param name the name of the account holder
*/
public BankAccount(String name, double initialBalance) {
this.name = name;
balance = initialBalance;
accountNo = ++lastAccountNo;
}
/**
* Deposits money into the bank account.
* @param amount the amount to deposit
*/
public void deposit(double amount) {
double newBalance = balance + amount;
balance = newBalance;
}
/**
* Withdraws money from the bank account.
* @param amount the amount to withdraw
*/
public void withdraw(double amount) {
double newBalance = balance - amount;
balance = newBalance;
}
/**
* Gets the current balance of the bank account.
* @return the current balance
*/
public double getBalance() {
return balance;
}
/**
* Gets the name of the account holder.
* @returns the name of the account holder
*/
public String getName() {
return name;
}
/**
* Gets the account number of the account.
* @returns the account number of the account
*/
public int getAccountNo() {
return accountNo;
}
/**
* Returns a String representation of the BankAccount. The format
* is "name: accountNo balance"
* @returns a String representation of the BankAccount.
*/
public String toString() {
return name + ": AccountNo:" + accountNo + " balance:" + balance;
}
private double balance;
private String name;
private int accountNo;
private static int lastAccountNo=0;
public int compareTo(BankAccount b) {
if(this.name.compareTo(b.name) == 0 && this.balance > b.balance) return 0;
else if(this.name.compareTo(b.name) < 0 && this.balance < b.balance) return 1;
else if(this.name.compareTo(b.name) > 0 && this.balance == b.balance) return -1;
//else if(this.name.compareTo(b.name) == 0) return 0;
//else if(this.name.compareTo(b.name) < 0) return 1;
//else if(this.name.compareTo(b.name) > 0) return -1;
else if(this.balance == b.balance) return 0;
else if(this.balance < b.balance) return 1;
else if(this.balance > b.balance) return -1;
else return 0;
}
}
银行帐户测试程序
import java.util.ArrayList;
import java.util.Collections;
class BankAccountTester {
public static void main(String args[]) {
ArrayList<BankAccount> accounts = new ArrayList<BankAccount>();
accounts.add(new BankAccount("Louis Oliphant", 100.0));
accounts.add(new BankAccount("Louis Oliphant", 100.10));
accounts.add(new BankAccount("Louis Oliphant", 100.0));
accounts.add(new BankAccount("Jane Doe", 100.0));
accounts.add(new BankAccount("Jane Doe", 99.0));
accounts.add(new BankAccount("Jane Doe", 100.0));
System.out.println("*****Unsorted******");
for (BankAccount b : accounts) {
System.out.println(b);
}
System.out.println();
Collections.sort(accounts);
System.out.println("******Sorted******");
for (BankAccount b : accounts) {
System.out.println(b);
}
}
}
你应该重新考虑一下你的逻辑,如果两个银行账户的名字不相等,那么金额的比较就没有必要了,不是吗?
public int compare(BankAccount o1, BankAccount o2) {
int compareName = o1.getName().compareTo(o2.getName());
if (compareName == 0) {
// When the balance of the current amount is greater than the
// balance of the compared account, then the current accounts
// "precedes" the compared account, and thus -1 is returned.
// If the balance is less, than this account "follows" the
// compared account, and 1 is preceded.
// Otherwise, 0 is returned.
return (0 - Double.compare(o1.getBalance(), o2.getBalance()));
}
else {
return compareName;
}
}
或更短:
public int compare(BankAccount o1, BankAccount o2) {
if (o1.getName().compareTo(o2.getName()) < 0) { return -1; }
else if (o1.getName().compareTo(o2.getName()) > 0) { return 1; }
return (0 - Double.compare(o1.getBalance(), o2.getBalance()));
}
正如其他人提到的,我建议使用分开的比较器
顺便说一句,在处理货币值时,应该使用
BigDecimal
s而不是double
s。参见Double vs.BigDecimal?。
注1:当帐户名相等时,上面的代码块返回字典序差异,请参阅
String。compareTo(String)
,也就是说,它们并不总是返回-1、
0或
注意2:当您计划覆盖
equals(Object)
和hashCode()
方法时,请记住强烈建议,尽管不严格要求x.compareTo(y)==0
等于x.equals(y)
,请参阅可比
问题内容: 我有一个列表列表(由于必须动态生成它,所以不能是元组),它的结构为一个int和一个float的列表列表,像这样: 我想对它进行排序,但我只能设法获得内置的排序功能,以便按列表的第一个元素对其进行排序,或者什么也不做,但是我需要按列表的第二个元素对它们进行排序,但是我没有不想实现我自己的排序功能。所以我想要的一个例子是: 有人可以告诉我如何获取内置的排序功能之一来执行此操作吗? 问题答案
本文向大家介绍python使用sorted函数对列表进行排序的方法,包括了python使用sorted函数对列表进行排序的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python使用sorted函数对列表进行排序的方法。分享给大家供大家参考。具体如下: python提供了sorted函数用于对列表进行排序,并且可以按照正序或者倒序进行排列 希望本文所述对大家的Python程序设计有
问题内容: 我想对整数的arraylist的arraylist进行排序,需要帮助吗? 我被告知,我需要实现比较器或可比对象,然后使用collection.sort对列表列表进行排序… 问题答案: 没有错误检查空列表,但是这里是。 使用Java 8,它变得更加简洁:
我一直在做拼字游戏作业。我需要从列表中读取单词,然后读取每个字符并赋值,最终为每个单词分配一个总分。已经完成了!唷。现在我需要使用比较器将单词从最高分到最低分进行排序。读了很多,还是很迷茫。我知道我可以使用接口,但也有使用lambda表达式的比较器,这是我想去的方向。我只是不知道该怎么做。我需要比较每个单词的sumValue,然后按降序打印单词。 我创建了 2 个循环来读取单词 (i),然后是字符
本文向大家介绍java对数组进行排序的方法,包括了java对数组进行排序的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java对数组进行排序的方法。分享给大家供大家参考。具体如下: 执行结果: 排序前: 12 24 25 4 9 68 45 7 排序后: 4 7 9 12 24 25 45 68 希望本文所述对大家的java程序设计有所帮助。
问题内容: 我想知道,流(或收集器)中是否已经有一个已实现的功能,已将列表作为值进行了排序。例如,以下代码均产生按年龄分组的按性别分组的人员清单。第一个解决方案具有一些开销排序(看起来有些sc琐)。第二种解决方案需要对每个人进行两次检查,但是必须做到很好。 首先排序,然后分组为一个流: 首先分组,然后对每个值进行排序: 我只是想知道,是否已经实现了某项功能,该功能可以一次运行,例如。 问题答案: