下面提供的代码用于对int
值进行排序。我现在要做的是将它们分类为String
个。
public class Comparable5 {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Student1(2, "Thilan"));
ts.add(new Student1(1, "Kamal"));
ts.add(new Student1(3, "Nimal"));
System.out.println(ts);
}
}
class Student1 implements Comparable<Student> {
int id;
String name;
public Student1(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return this.id + ":" + this.name;
}
@Override
public int compareTo(Student o) {
if (o.name.equals(this.name)) {
return -1;
} else if (o.name.equals(this.name)) {
return +1;
} else {
return 0;
}
}
}
我正在尝试使用Comparable接口来提升名称。我使用了equals()
方法,但是无法获得升序。我尝试使用可比较的界面比较不同的对象。我使用了具有两个参数的构造函数。
我已经完成了对ID的排序,但是无法按名称(字符串)对它们进行排序。如何在Comparable接口中使用compareTo()
方法对字符串进行排序?
答案 0 :(得分:3)
这里:
@Override
public int compareTo(Student o) {
return this.name.compareTo(o.name);
}
是您所需要的全部。
但是,当然,您真正需要了解的是这些compareTo()
方法背后的想法。您的代码暗示您没有。当两个条件为等于时,您将返回0。只有那样!
在您的情况下,您可以将所有工作委托给String类的compareTo()
实现(它将使用字典顺序排序来计算结果),例如,请参见here。
但是正如所说的:您真正的问题是缺乏对为什么的理解!除此之外:请注意,引用可以为 null 。我的例子就是:一个例子。在现实世界的代码中,您将不得不做更多的事情,例如考虑哪些值可以为null,以及代码应如何对此做出反应,以免产生异常。
答案 1 :(得分:2)
字符串具有可比性(即,它实现了Comparable<String>
),因此您可以调用字符串的compareTo()
方法。
@Override
public int compareTo(Student o) {
return this.name.compareTo(o.name);
}
如果要撤消顺序,请交换this
和o
。
答案 2 :(得分:0)
@Override
public int compareTo(Student student) {
return this.name.compareTo(student.name);
}
将此对象与指定对象进行比较。当此对象小于,等于或大于指定的对象时,返回负整数,零或正整数。
答案 3 :(得分:0)
请注意,
class Student1 implements Comparable<Student>
您可能会遇到问题。查看Comparable
的Javadoc,您
必须确保所有x和y的sgn(x.compareTo(y))== -sgn(y.compareTo(x))
和
该关系是可传递的:(x.compareTo(y)> 0 && y.compareTo(z)> 0)表示x.compareTo(z)> 0。
这意味着您还需要确保Student implements Comparable<Student1>
进行正确的比较。
这并不是您想走的路。