如何使用可比接口比较两个字符串?

时间:2018-06-20 07:38:35

标签: java sorting collections comparable

下面提供的代码用于对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()方法对字符串进行排序?

4 个答案:

答案 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);
}

如果要撤消顺序,请交换thiso

答案 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>进行正确的比较。

这并不是您想走的路。