Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据对象的属性按自定义顺序排序对象的arraylist_Java_Sorting_Arraylist_Comparator - Fatal编程技术网

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.