Java 使用可比较界面对日期进行排序

Java 使用可比较界面对日期进行排序,java,Java,我正试图编写一个简单的程序,通过从最早的日期到最晚的日期排序,对给定日期的顺序进行排序 我可以按年份对日期进行排序,但是当两个日期的年份相同,我需要按月份排序时,它开始出现问题。我一直在尝试嵌套if语句,并尝试实现while循环,但似乎并没有完全正确。我知道在我的if语句中,我缺少了某种类型的语句,它告诉java按monthd.年) .然后比较(d->d.月) .然后比较(d->d.天); @凌驾 公共整数比较(日期其他){ returndatecomparator.compare(这个,其他)

我正试图编写一个简单的程序,通过从最早的日期到最晚的日期排序,对给定日期的顺序进行排序

我可以按年份对日期进行排序,但是当两个日期的年份相同,我需要按月份排序时,它开始出现问题。我一直在尝试嵌套if语句,并尝试实现while循环,但似乎并没有完全正确。我知道在我的if语句中,我缺少了某种类型的语句,它告诉java按
month
day
排序,但我不能完全正确地得到它

当前输入/输出:

[1999年10月5日,1999年19月5日,1999年10月3日,1999年19月3日,2000年10月5日,2000年19月5日,2000年10月3日,2000年19月3日]

[10/3 1999、10/3 2000、19/3 1999、10/5 1999、10/5 2000、19/5 1999、19/3 2000、19/5 2000]

课程日期{
私人国际年;
私人整数月;
私人国际日;
公开日期(整数年、整数月、整数日){
今年=年;
本月=月;
this.day=天;
}
@凌驾
公共整数比较(日期其他){
如果(年份<其他年份){
返回整数。比较(本年、其他年);
}
如果(年份==其他年份){
返回整数.compare(this.month,other.month);
}
如果(月==其他月份){
返回整数.compare(this.day,other.day);
}
回归日;
}
公共字符串toString(){
返回日+“/”+月+“+年;
}
}

您没有检查所有病例多年,
年<其他。年
应该是
年!=其他.年份
除此之外,还有一些其他问题。你想做的是:

if years aren't same
 return sort by year
else, if months aren't same
 return sort by months
else
 return sort by days

您没有检查所有案例的年份,
year
应该是
year!=其他.年份
除此之外,还有一些其他问题。你想做的是:

if years aren't same
 return sort by year
else, if months aren't same
 return sort by months
else
 return sort by days

三个字段的编码比较容易出错。为了最大限度地降低bug风险,请使用
比较器
接口的
比较法和
然后比较法
方法,如注释中已经提到的Aomine:

private static final Comparator<Date> dateComparator 
        = Comparator.comparingInt((Date d) -> d.year)
                .thenComparingInt(d -> d.month)
                .thenComparingInt(d -> d.day);

@Override
public int compareTo(Date other) {
    return dateComparator.compare(this, other);
}
private静态最终比较器dateComparator
=比较器。比较器((日期d)->d.年)
.然后比较(d->d.月)
.然后比较(d->d.天);
@凌驾
公共整数比较(日期其他){
returndatecomparator.compare(这个,其他);
}
更好的是,为字段提供getter,并使用
Date::getYear
而不是
(dated)->d.year
,对于月份和日期也是如此


它的优点并不在于它更短。最大的优点是很难出错。

对三个字段进行编码比较容易出错。为了最大限度地降低bug风险,请使用
比较器
接口的
比较法和
然后比较法
方法,如注释中已经提到的Aomine:

private static final Comparator<Date> dateComparator 
        = Comparator.comparingInt((Date d) -> d.year)
                .thenComparingInt(d -> d.month)
                .thenComparingInt(d -> d.day);

@Override
public int compareTo(Date other) {
    return dateComparator.compare(this, other);
}
private静态最终比较器dateComparator
=比较器。比较器((日期d)->d.年)
.然后比较(d->d.月)
.然后比较(d->d.天);
@凌驾
公共整数比较(日期其他){
returndatecomparator.compare(这个,其他);
}
更好的是,为字段提供getter,并使用
Date::getYear
而不是
(dated)->d.year
,对于月份和日期也是如此


它的优点并不在于它更短。最大的优点是很难出错。

第一个条件应该是
if(year!=other.year){
dates.sort(Comparator.comparingit(Date::getYear)。然后是comparingit(Date::getMonth));
我希望你已经知道了,所以对于以后阅读这个问题的其他人来说:对于生产代码,你不应该开发自己的日期类。你应该使用内置的
LocalDate
(是的,它实现了
Comparable
)。第一个条件应该是
if(year!=other.year){
dates.sort(Comparator.comparingInt(Date::getYear)。然后comparingInt(Date::getMonth));
我希望您已经知道,所以对于将来阅读此问题的任何人来说:对于生产代码,您不应该开发自己的日期类。您应该使用内置的
LocalDate
(是的,它实现了
可比性
)。