如何根据 2 个属性对对象集合进行排序

How to sort a Collection of objects based on 2 properties

我有一个 class 这样的:

    static class Transactions{
    private int type;
    private String to;
    private String from;
    private double amount;
    public Transactions (int type, String to, String from, double amount) {
        if(type>=1 || type<=3) {
            this.type=type;
            this.to=to;
            this.from=from;
            this.amount=amount;
        }
        else
            throw new InvalidParamaterException(type);
    }
//This is for deposits and withdrawal
    public Transactions (int type, String para, double amount) {
        
    }
    public int getType() {
        return type;
    }
    public String getTo() {
        return to;
    }
    public String getFrom() {
        return from;
    }
    public double getAmount() {
        return amount;
    }
    
        
    }

static class Bank {
private String Name;
private ArrayList<Customer> customers = new ArrayList<>();
private ArrayList<Company> companies = new ArrayList<>();
private ArrayList<Account> accounts = new ArrayList<>();
private String Address;
public Bank(String Name, String Address) {
    this.Name=Name;
    this.Address=Address;
}
public void processTransactions(Collections ts) {
    Comparator<Transactions> byTypeAndTo = 
            Comparator.comparing(Transactions::getType)
                .thenComparing(Transactions::getTo);
    ts.sort(byTypeAndTo);
}

我想做的是创建一个 Transactions 集合,然后按 type 对该集合进行排序。类型只有值 123,排序应按此顺序进行。

如果两笔交易类型相同,我想按String属性排序to那是一个账号,所以都是数字).

如何使用这样的两个参数对集合进行排序?

processTransactions()方法应该将未排序的集合作为参数,对它们进行排序和处理。

但是最后一行代码报错:

The method sort(List<T>) in the type Collections is not 
applicable for the arguments (Comparator<Assignment02_20190808022.Transactions>)

使用JavaComparator接口的8个方法comparing() and thenComparing():

Comparator<Transactions> byTypeAndTo = 
            Comparator.comparing(Transactions::getType)
                .thenComparing(Transactions::getTo);

为了对对象列表进行排序,您可以对其应用方法 sort(),自 Java 8:

起可用
transactions.sort(byTypeAndTo);

你可以玩这个Online demo

有关如何使用 Java 8 构建比较器的更多信息,请查看此 tutorial.

But the last line of code gives an error:

方法签名不正确,我认为应该是:

public void processTransactions(Collection<Transactions> ts)

不要混淆实用程序 class CollectionsCollection 接口,也不要省略通用类型参数。

您只能在类型为 List 的对象上调用方法 sort()(与 Collections.sort() 相同,它需要一个列表和比较器)。

为了对伪装成 Collection 的列表进行排序,您需要应用转换。由于您要求您的方法应该期望类型为 Collection 的参数,因此没有其他解决方法(但这不是好的设计)。这就是它的样子:

public void processTransactions(Collection<Transactions> ts) {
    if (!(ts instanceof List<Transactions>)) {
        throw new IllegalArgumentException();
    }
    List<Transactions> transactions = (List<Transactions>) tr;
    
    transactions.sort(byTypeAndTo);

    // process the `transactions` list
}

注意:最好将 Bank class 中的比较器定义为 public static final 字段。