我一直在研究一些需要我按三个属性- name (str)
, colour (str)
和volume (int)
对对象(软饮料)进行排序的东西。我研究了一下,找到了按名称、颜色和体积分别订购它们的方法,但有没有一种方法可以同时按这三种方式订购呢?
我的意思是:例如,假设有四个软饮料对象:芬达橙色500,可乐红色500,可乐银色500,芬达橙色400。
我正在寻找的输出将是:
- 1)可乐红500
- 2)焦银500
- 3)芬达橙400
- 4)芬达橙500
先按名称排序,然后是颜色,然后是音量(升序)。
我目前使用三个比较器:nameComparator
, colourComparator
和volumeComparator
,但它们每个只按名称排序对象,然后只按颜色,然后只按体积。是否可以根据比较器的多个属性进行排序?
试试这样:
drinks.sort(
Comparator.comparing(Drink::getName).thenComparing(Drink::getColour).thenComparing(Drink::getVolume)
);
请记住为您的属性(getName
, getColour
等)提供getter。这就是您所需要的,不需要任何自定义比较器或任何东西。
Alex!
回答您关于使用比较器按多个属性排序实体的问题,这里是java对象排序教程的链接:https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html
特别是有一个比较器的例子,它首先按日期比较对象,然后(如果相等)按数字比较它们:
static final Comparator<Employee> SENIORITY_ORDER =
new Comparator<Employee>() {
public int compare(Employee e1, Employee e2) {
int dateCmp = e2.hireDate().compareTo(e1.hireDate());
if (dateCmp != 0)
return dateCmp;
return (e1.number() < e2.number() ? -1 :
(e1.number() == e2.number() ? 0 : 1));
}
};
很容易将此模式应用到您的案例中:
static final Comparator<SoftDrink> DRINKS_ORDER = new Comparator<SoftDrink>() {
public int compare(SoftDrink d1, SoftDrink d2) {
int nameCmp = d1.getName().compareTo(d2.getName());
if (nameCmp != 0) {
return nameCmp;
}
int colorCmp = d1.getColor().compareTo(d2.getColor());
if (colorCmp != 0) {
return colorCmp;
}
return d1.getVolume() < d2.getVolume() ? -1 : (d1.getVolume() == d2.getVolume() ? 0 : 1);
}
};
在调用compareTo方法之前,请确保检查值是否为空(如果有必要)。