如何根据 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
对该集合进行排序。类型只有值 1
、2
、3
,排序应按此顺序进行。
如果两笔交易类型相同,我想按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 Collections
和 Collection
接口,也不要省略通用类型参数。
您只能在类型为 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
字段。
我有一个 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
对该集合进行排序。类型只有值 1
、2
、3
,排序应按此顺序进行。
如果两笔交易类型相同,我想按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 Collections
和 Collection
接口,也不要省略通用类型参数。
您只能在类型为 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
字段。