对对象的ArrayList进行排序?

时间:2012-03-13 07:16:38

标签: java

我需要一些帮助如何对对象的ArrayList进行排序。我有超类帐户和两个子类SavingsAccount和CreditAccount。在Account类中,当我想知道帐号时,我有这个方法来调用:

// Get account number
public String getAccountNumber() {
    return accountNumber;
}

我需要对帐号进行排序,以获得对象中所有帐户的最大数量?

ArrayList是这样的:

ArrayList<Account> accountList = new ArrayList<Account>();

这可以用简单而不复杂的方式完成吗?谢谢!

7 个答案:

答案 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)不得为列表中的任何元素ClassCastExceptione1抛出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等,然后可以根据需要以不同的方式对列表进行排序。