gpt4 book ai didi

java - 如何编写比较器

转载 作者:行者123 更新时间:2023-12-01 14:09:31 28 4
gpt4 key购买 nike

public class Date {
private int month; // must be 1-12
private int day; // must be 1-31

public int getMonth() {return month;}

public int getDay() {return day;}

public Date(int m, int d) {
if (m >= 1 && m <= 12)
month = m;
else
month = 1;

if (d >= 1 && d <= 31)
day = d;
else
day = 1;
} // end constructor
} // end class Date

比较器类

import java.util.*;
public class DateComparator implements Comparator <Date>{
public int compare(Date date1, Date date2){
if (date1.getMonth() > date2.getMonth()){
return 1;
}
else if(date1.getMonth() < date2.getMonth()){
return -1;
}
else{ //if(date1.getMonth() == date2.getMonth()){
if (date1.getDay() > date2.getDay()){
return 1;
}
if (date2.getDay() < date2.getDay()){
return -1;
}
else{// (date2.getDay() == date2.getMonth()){
return 0;
}
}
}
}

我正在尝试为这个日期类编写一个比较器,我想知道这是否是正确的方法。任何建议将不胜感激!

最佳答案

首先,这个问题似乎更适合Code Review .但是有一些概念需要解释,超出了代码审查范围,所以我决定发布一个答案。

初稿

您的比较器可以被视为初稿。它运行良好,并按指定比较两个 Date 对象。干得好。

代码改进

许多 if-else-statements 使比较器有些笨拙且难以阅读。请记住,比较方法不一定返回 -1、0 或 1。如果第一个参数小于第二个参数,它可以返回任何负数,如果第一个参数大于第二个参数,则返回任何正数一。只有返回 0 才绑定(bind)相等。

由于月和日都表示为整数,因此您可以简单地在一些算术中使用它们。月差更重要 - 它更重 - 所以它必须更重:

public int compare(Date date1, Date date2) {
int monthDiff = date1.getMonth() - date2.getMonth();
int dayDiff = date1.getDay() - date2.getDay();
return monthDiff * 100 + dayDiff;
}

减法已经产生负数、零或正数。所以使用它们。因子 100 使月份差异比日期差异更重要。

如果月差不为 0,则添加日差不会有任何影响(因为因子为 100)。只有当月差为0时,日差才重要。

代码结构

以这种方式比较两个日期看起来很自然。事实上,这是日期的自然顺序。如果一个类型有这样的自然顺序,你应该(必须)让它实现Comparable:

public class Date implements Comparable<Date> {
...
@Override
public int compareTo(Date other) {
int monthDiff = this.getMonth() - other.getMonth();
int dayDiff = this.getDay() - other.getDay();
return monthDiff * 100 + dayDiff;
}
}

其他比较器

如果你觉得你必须有一些其他的比较器,你可以随时添加它们。一个好的地方是在您的 Date 类中嵌套静态类(因为它们只是属于它)。

让我们做一个只考虑月份的比较器:

public class Date implements Comparable<Date> {
...
public static final class MonthComparator implements Comparator<Date> {
@Override
public int compare(Date date1, Date date2) {
return date1.getMonth() - date2.getMonth();
}
}
}

关于java - 如何编写比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29389063/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com