我正在尝试编写一个简单的程序,通过从最早的日期到最晚的日期排序来排序给定日期的顺序。
我可以按日期对日期进行排序,但是当2个日期具有相同的年份并且我需要按月份进行排序时,就会出现问题。我一直在尝试嵌套if语句,并尝试实现while循环,但是我似乎不太正确。我知道我的if语句中缺少某种类型的语句,该语句告诉java按month < other.month
和day < other.day
进行排序,但我不太正确...
当前输入/输出:
[10/5 1999、19 / 5 1999、10 / 3 1999、19 / 3 1999、10 / 5 2000、19 / 5 2000、10 / 3 2000、19 / 3 2000]
[10/3 1999、10 / 3 2000、19 / 3 1999、10 / 5 1999、10 / 5 2000、19 / 5 1999、19 / 3 2000、19 / 5 2000]
class Date implements Comparable<Date> {
private int year;
private int month;
private int day;
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
@Override
public int compareTo(Date other) {
if(year < other.year) {
return Integer.compare(this.year, other.year);
}
if(year == other.year) {
return Integer.compare(this.month, other.month);
}
if(month == other.month) {
return Integer.compare(this.day, other.day);
}
return day;
}
public String toString() {
return day + "/" + month + " " + year;
}
}
答案 0 :(得分:3)
您多年来没有检查所有案件,year < other.year
应该为year != other.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
答案 1 :(得分:2)
三个字段的编码比较容易出错。为了最大程度地减少错误的风险,请使用comparingInt
界面的thenComparingInt
和Comparator
方法,例如注释中已经提到的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);
}
更好的是,为字段提供吸气剂,并使用Date::getYear
代替(Date d) -> d.year
,并且类似地使用月份和日期。
优点不是很多,而是更短。最大的优点是很难犯错。