我有两个班级:
First implements Serializable {
int month;
int day;
int hour;
int minute;
}
Second implements Serializable, Comparable<?> {
First object;
int temperature;
}
我不得不将Second类的对象写入二进制文件。我知道他们需要实现Serializable接口这样做,我没有问题。问题是我必须创建一个这段代码的版本,这样就可以按照First类中保存的日期,按时间顺序将第二类的新对象添加到集合中。所以我需要比较整数(月,日,小时,分钟)。我知道我必须在Second类中声明方法CompareTo。如果我必须比较字符串,那就像(如果分钟是字符串):
public int compareTO(Second object) {
return minute.compareTo(object.object.minute);
}
已经完成了。但是我应该怎么处理这些整数呢? 我应该在“?”的位置写什么?在代码?
答案 0 :(得分:2)
您的课程需要定义
class Second implements Serializable, Comparable<Second> {
public int compareTo(Second other) {
在Java 7中,您可以使用
return Integer.compare(minute, object.minute);
或您可以执行多个字段
int cmp = Integer.compare(month, other.month);
if (cmp != 0) return cmp;
cmp = Integer.compare(days, other.days);
if (cmp != 0) return cmp;
cmp = Integer.compare(hours, other.hours);
if (cmp != 0) return cmp;
return Integer.compare(minutes, other.minutes);
对于早期的Java系统
return Double.compare(minute, object.minute);
或者
return minute > object.minute ? +1 : minute < object.minute ? -1 : 0;
在这种情况下,如果你知道你的整数范围小于20亿,即你不能得到溢出,你可以使用减法
return minute - object.minute; // if you know overflow is not possible.
答案 1 :(得分:1)
我假设这里的实际问题是关于如何处理多个 int值。您可以简单地进行词典比较:
public static int compareByTime(Second s0, Second s1)
{
First f0 = s0.object;
First f1 = s1.object;
if (f0.month > f1.month) return 1;
if (f0.month < f1.month) return -1;
if (f0.day > f1.day) return 1;
if (f0.day < f1.day) return -1;
if (f0.hour > f1.hour) return 1;
if (f0.hour < f1.hour) return -1;
if (f0.minute > f1.minute) return 1;
if (f0.minute < f1.minute) return -1;
return 0;
}
一般情况下,我建议不让类实现Comparable
。如果类具有自然排序,则应该仅。对于你的Second
课程,情况肯定不是这样。在大多数情况下,使用Comparator
会更加灵活。但是,此方法既可用于实施Comparable
,也可用于实施Comparator
。
编辑:在回应评论时稍微详细说明一下:
此方法用于两个Second
对象的一般比较。您可以在Second
类实现Comparable
接口时使用它:
Second implements Serializable, Comparable<Second>
{
First object;
int temperature;
@Override
public int compareTo(Second other)
{
return compareByTime(this, other); // The method from above
}
}
或者,您可以在为Comparator
对象创建Second
时使用它:
class SecondComparator implements Comparator<Second>
{
@Override
public int compare(Second s0, Second s1)
{
return compareByTime(s0, s1); // The method from above
}
}
在这两种情况下,您都可以将新对象插入到总是排序的TreeSet<Second>
这样的集合中。或者,如果您使用List<Second>
,则可以对二进制搜索插入对象的位置进行二进制搜索。 (或者只是将新对象添加到列表中,然后对列表进行排序,但这样效率会相当低)