我刚刚发现这个考试题目,但无法弄清楚:
下面描述了一个实现Comparable接口的设计部分类。这个设法类的唯一目的是将它的实例与给定的字符串进行比较。
我们需要在课堂上填写两件事来完成它。这是班级:
public class PrivateComparableClass // FILL IN PART 1 {
private String thing;
public PrivateComparableClass(String thing) {
this.thing=thing;
}
//FILL IN PART 2
}
我假设第1部分只对应于:
public class PrivateComparableClass implements Comparable {
第2部分,我假设他期待compareTo方法的实现,但我真的不知道如何正确地实现这个:
public static int compareTo() {
if this.thing.equals(thing){
return 1;
} else {
return -1;
}
}
我将如何解决这个问题?
答案 0 :(得分:5)
首先,第1部分应该是:
public class PrivateComparableClass implements Comparable<PrivateComparableClass> {
至于第2部分,如果thing
是班级中唯一的数据成员,您可以简单地搭载String.compareTo
:
public int compareTo(PrivateComparableClass rhs) {
return this.thing.compareTo(rhs.thing);
}
我建议您阅读compareTo
is meant to work的方式(有三种可能的结果:小于,等于和大于)。
答案 1 :(得分:2)
扩大一点:
比较器函数通常采用两个参数(让我们称之为A和B)并遵循返回的约定
另外,如果使用实例变量,则不应将compareTo声明为“static”。
答案 2 :(得分:2)
首先,Comparable
接口是通用的;你的声明应该指定一个类型参数:
public class PrivateComparableClass
implements Comparable<PrivateComparableClass> {
然后,您应该在thing
方法(这是一个实例方法,而不是类成员)中比较该类的compareTo()
成员。
@Override
public final int compareTo(PrivateComparableClass that) {
return this.thing.compareTo(that.thing);
}
行为良好的Comparable
应实施与equals()
方法一致的compareTo()
方法:
@Override
public final boolean equals(Object obj) {
if (obj == this)
return true;
if (!(obj instanceof PrivateComparableClass))
return false;
return compareTo((PrivateComparableClass) obj) == 0;
}
而且,当您覆盖equals()
时,您还需要覆盖hashCode()
:
@Override
public final int hashCode() {
return thing.hashCode();
}
如果thing
真的被允许为null
,则应该为每个方法添加合适的空值检查行为。
答案 3 :(得分:0)
嗯,这或多或少是如何声明和实现类的
public class PrivateComparableClass implements Comparable<PrivateComparableClass>
{
private String thing;
//... other stuff
public int compareTo(PrivateComparableClass o)
{
return this.thing.compareTo(o.thing);
}
}