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

时间:2018-12-03 18:37:53

标签: java

我正在尝试编写一个简单的程序,通过从最早的日期到最晚的日期排序来排序给定日期的顺序。

我可以按日期对日期进行排序,但是当2个日期具有相同的年份并且我需要按月份进行排序时,就会出现问题。我一直在尝试嵌套if语句,并尝试实现while循环,但是我似乎不太正确。我知道我的if语句中缺少某种类型的语句,该语句告诉java按month < other.monthday < 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;
    }
}

2 个答案:

答案 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界面的thenComparingIntComparator方法,例如注释中已经提到的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,并且类似地使用月份和日期。

优点不是很多,而是更短。最大的优点是很难犯错。