Java 根据对象的属性按自定义顺序排序对象的arraylist
我需要按照自己的字符串属性按自定义顺序(而不是字母顺序)对数组列表进行排序Java 根据对象的属性按自定义顺序排序对象的arraylist,java,sorting,arraylist,comparator,Java,Sorting,Arraylist,Comparator,我需要按照自己的字符串属性按自定义顺序(而不是字母顺序)对数组列表进行排序 List<WeekSales> saleList = new ArrayList<>(); ... 属性day始终是一周中的一天。(“星期日”、“星期一”等)因此我需要按照一周的顺序对列表中的元素进行排序(“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”、“星期日”) 所以我尝试了google.common.collect.Ordering.但它给了我一个错误 无法比较值:
List<WeekSales> saleList = new ArrayList<>();
...
属性day
始终是一周中的一天。(“星期日”、“星期一”等)因此我需要按照一周的顺序对列表中的元素进行排序(“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”、“星期日”)
所以我尝试了google.common.collect.Ordering.
但它给了我一个错误
无法比较值:com.certus.controllers.WeekSales
除非您实际尝试对包含在
Ordering.explicit
参数中列出的项的列表进行排序,否则它不知道如何对它们进行排序。还不清楚您是否已经覆盖了WeekSales.equals
(和hashCode
),这也是该操作所必需的
您需要实际告诉它要比较的字段:
class YourComparator implements Comparator<WeekSales> {
private final Ordering<String> dayOrdering = Ordering.explicit(
"Monday", "Tuesday", ... );
@Override public int compare(WeekSales a, WeekSales b) {
return dayOrdering.compare(a.getDay(), b.getDay());
}
}
类YourComparator实现Comparator{
私人最终订购日订购=Ordering.explicit(
"星期一,"星期二,",;
@覆盖公共整数比较(周销售a、周销售b){
返回dayOrdering.compare(a.getDay(),b.getDay());
}
}
除非您实际尝试对包含Ordering.explicit
参数中列出的项目的列表进行排序,否则它不知道如何对它们进行排序。还不清楚您是否已经覆盖了WeekSales.equals
(和hashCode
),这也是该操作所必需的
您需要实际告诉它要比较的字段:
class YourComparator implements Comparator<WeekSales> {
private final Ordering<String> dayOrdering = Ordering.explicit(
"Monday", "Tuesday", ... );
@Override public int compare(WeekSales a, WeekSales b) {
return dayOrdering.compare(a.getDay(), b.getDay());
}
}
类YourComparator实现Comparator{
私人最终订购日订购=Ordering.explicit(
"星期一,"星期二,",;
@覆盖公共整数比较(周销售a、周销售b){
返回dayOrdering.compare(a.getDay(),b.getDay());
}
}
您可以使用地图提供帮助
Map<String, Integer> dayToOrder= new HashMap<>();
for (String day: "Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday".split(","))
dayToOrder.put(day, dayToOrder.size());
然后,您可以使用ordinal()
你可以用地图来帮忙
Map<String, Integer> dayToOrder= new HashMap<>();
for (String day: "Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday".split(","))
dayToOrder.put(day, dayToOrder.size());
然后,您可以使用ordinal()
您不能以这种方式实现比较器:
Comparator<WeekSales> com = new Comparator<WeekSales>() {
@Override
public int compare(WeekSales o1, WeekSales o2) {
//do stuff with o1 and o2 by getDay()
return 0;
}
};
比较器com=新比较器(){
@凌驾
公共整数比较(周销售o1,周销售o2){
//在getDay()之前用o1和o2做事情
返回0;
}
};
您不能这样实现比较器吗:
Comparator<WeekSales> com = new Comparator<WeekSales>() {
@Override
public int compare(WeekSales o1, WeekSales o2) {
//do stuff with o1 and o2 by getDay()
return 0;
}
};
比较器com=新比较器(){
@凌驾
公共整数比较(周销售o1,周销售o2){
//在getDay()之前用o1和o2做事情
返回0;
}
};
您可以在工作日使用枚举:
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
然后你的班级会是这样的:
public class WeekSales implements Comparable<WeekSales>{
private WeekDay day;
private int amount;
//Add a comparison method
public int compareTo(WeekSales otherWeekSales) {
return this.day.ordinal() - otherWeekSales.day.ordinal();
}
}
您可以在工作日使用枚举:
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
然后你的班级会是这样的:
public class WeekSales implements Comparable<WeekSales>{
private WeekDay day;
private int amount;
//Add a comparison method
public int compareTo(WeekSales otherWeekSales) {
return this.day.ordinal() - otherWeekSales.day.ordinal();
}
}
我猜你的意思是“星期一,等等”。分开(“,”)@sashasalauu你工作得更好,不是我把名字说对了有了您的回答,我可以在没有任何外部库支持的情况下进行订购。我真的很欣赏事实。但是在我的例子中,使用@AndyTurner的答案很容易,而不需要对代码做太多更改。谢谢。我猜你的意思是“星期一等”。分开(“,”)@SashaSalauyou工作得更好,不是我把名字说对了有了您的回答,我可以在没有任何外部库支持的情况下进行订购。我真的很欣赏事实。但是在我的例子中,使用@AndyTurner的答案很容易,而不需要对代码做太多更改。谢谢。
enum
已经可以比较了,你可以做day。compareTo(otherWeekSales.day)
Effective Java第二版第31项(“使用实例字段而不是序数”)表明这样使用序数不是一个好主意,例如,没有什么可以阻止某人“天真地”更改enum中成员的顺序,这改变了顺序。enum
已经可以比较了,你可以做day.compareTo(otherWeekSales.day)
有效的Java第二版第31项(“使用实例字段而不是序数”)表明这样使用序数不是一个好主意,例如,没有什么可以“无意”阻止某人更改枚举中成员的顺序,从而更改顺序。
public class WeekSales implements Comparable<WeekSales>{
private WeekDay day;
private int amount;
//Add a comparison method
public int compareTo(WeekSales otherWeekSales) {
return this.day.ordinal() - otherWeekSales.day.ordinal();
}
}
Collections.sort(saleList); //That will use the compareTo method implemented in the class.