我需要一些帮助如何对对象的ArrayList进行排序。我有超类帐户和两个子类SavingsAccount和CreditAccount。在Account类中,当我想知道帐号时,我有这个方法来调用:
// Get account number
public String getAccountNumber() {
return accountNumber;
}
我需要对帐号进行排序,以获得对象中所有帐户的最大数量?
ArrayList是这样的:
ArrayList<Account> accountList = new ArrayList<Account>();
这可以用简单而不复杂的方式完成吗?谢谢!
答案 0 :(得分:5)
首先,为什么帐户号被表示为字符串?它是一个数字,还是文本?无论如何,绝对可以使用Collections.sort
对您的列表进行排序:
Collections.sort(list, new Comparator<Account>() {
@Override public int compare(Account x, Account y) {
return x.getAccountNumber().compareTo(y.getAccountNumber();
}
});
如果你在错误的意义上对它们进行排序(升序而不是降序),则反转比较:
Collections.sort(list, new Comparator<Account>() {
@Override public int compare(Account x, Account y) {
return y.getAccountNumber().compareTo(x.getAccountNumber();
}
});
请注意,由于这些是字符串,因此会按字典顺序对它们进行排序。如果您使用的是数字,那就不会有问题了。
在这种情况下我不会推荐的另一种方法是让Account
实施Comparable<Account>
。当有一种比较两个账户的“自然”方式时,这是合适的 - 但我可以看到你有时可能希望按号码排序,有时候是通过账户持有人的名字排序,有时候是通过账户中的资金,有时是按日期排序帐户已创建等。
顺便说一句,目前还不清楚你真的需要对此进行排序 - 如果只是需要找到最大的帐号,你不需要要对它进行排序,您只需要迭代并记住编号最大的帐户:
Account maxAccount = null;
for (Account account : accounts) {
if (maxAccount == null ||
account.getAccountNumber().compareTo(maxAccount.getAccountNumber()) > 0) {
maxAccount = account;
}
}
答案 1 :(得分:0)
java.util.Collections.sort(list)
- 当Account实现Comparable时使用它。
java.util.Collections.sort(list, new Comparator<Account>(){
public int compare(Account a, Account b){
return a.getAccountNumber().compareTo(b.getAccountNumber()
}
});
答案 2 :(得分:0)
Collections.sort(accountList)
如果Account implements Comparable<Account>
,将有效。如果没有,你需要传入一个比较器
Collections.sort(accountList, new Comparator<Account>() {
public int compare(Account a, Account b) {
// Assumes account numbers are not null.
return a.getAccountNumber().compareTo(b.getAccountNumber());
}
});
来自javadoc:
public static <T extends Comparable<? super T>> void sort(List<T> list)
根据元素的自然顺序,将指定列表按升序排序。列表中的所有元素都必须实现
Comparable
接口。此外,列表中的所有元素必须具有可比性(即e1.compareTo(e2)
不得为列表中的任何元素ClassCastException
和e1
抛出e2
。
答案 3 :(得分:0)
使用Collections.sort(accountList );
对ArrayList
答案 4 :(得分:0)
您可以在Comparable
课程中实施Account
界面。
然后使用java.util.Collections.sort(list)
方法。
class Account implements Comparable<Account >{
....
@Override
public int compareTo(Account o) {
return this.getAccountNumber().compareTo(o.getAccountNumber());
}
...
}
}
答案 5 :(得分:0)
您可以在sort
实用程序和Collections
界面的自定义实现中使用Comparator
方法。
答案 6 :(得分:0)
我很遗憾地说你的问题不是很清楚。您的意思是“我需要对帐号进行排序以获得对象中所有帐户的最大数量?”我想你需要根据accountNumber对StringList进行排序,这是一个String !!
要在Java中对任何对象进行排序,他们应该实现简单的接口Comparable。大多数Java内置类(如String,Date等)已经实现了Comparable,这就是为什么我们能够对它们进行排序。对于我们的类,我们应该痛苦地告诉JVM应该在什么基础上对OUR对象进行排序。你可以告诉这个帐户类,如下所示
public class Account implements Comparable<Account>{
private String accountNumber;
public int compareTo(Account anotherAcct) {
// Do null Check for anotherAcct
return this.getAccountNumber().compareTo(anotherAcct.getAccountNumber());
}
public String getAccountNumber() {
return accountNumber;
}
}
现在只需调用Collections.sort(accountList)。
以下是示例测试代码和结果
Account acct1 = new Account("AA1");
Account acct2 = new Account("BB1");
Account acct3 = new Account("AA2");
Account acct4 = new Account("1FF");
List<Account> accountList = new ArrayList<Account>();
accountList.add(acct1);
accountList.add(acct2);
accountList.add(acct3);
accountList.add(acct4);
Collections.sort(accountList);
System.out.println(accountList);
此印刷
[帐户[accountNumber = 1FF],帐户[accountNumber = AA1],帐户[accountNumber = AA2],帐户[accountNumber = BB1]]
即按字母顺序递减。如果你想要反过来(增加字母顺序)你可以调用Collections.reverse(accountList)或者去改变compareTo()实现,如下所示。
public int compareTo(Account anotherAcct) {
// Do null Check for anotherAcct
//return this.getAccountNumber().compareTo(anotherAcct.getAccountNumber());
return anotherAcct.getAccountNumber().compareTo(this.getAccountNumber());
}
有时您可能处于无法使用Comparable接口完成此操作的位置(可能是因为您没有该类的源,或者它已经在实现Comparable接口以根据另一个属性进行排序,比如银行平衡!)。在这种情况下,您需要创建一个Comparator,如下所示。
public class AccountNumberComparator implements Comparator<Account>{
@Override
public int compare(Account account1, Account account2) {
// do null checks for both account1 and account2
return account1.getAccountNumber().compareTo(account2.getAccountNumber());
}
}
现在只需致电
Collections.sort(accountList,new AccountNumberComparator());
这种方法的优点是您可以根据不同的属性创建所需数量的比较器,如AccountBalanceComparator,AccountNameComparator等,然后可以根据需要以不同的方式对列表进行排序。