Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中Lexography字符串比较背后的逻辑是什么?_Java - Fatal编程技术网

java中Lexography字符串比较背后的逻辑是什么?

java中Lexography字符串比较背后的逻辑是什么?,java,Java,我正在用java实现一个简单的比较器来按名称(altabely)对树集中的对象进行排序。结果与我预期的不同,我很难理解java的String compareTo()方法背后的逻辑。我的期望是字符串按字母顺序排列 下面是代码列表: 学生班 enum Grade{ A, B, C; } class Student { private int studentId; private String studentName; private int rollNumber;

我正在用java实现一个简单的比较器来按名称(altabely)对树集中的对象进行排序。结果与我预期的不同,我很难理解java的String compareTo()方法背后的逻辑。我的期望是字符串按字母顺序排列

下面是代码列表:

学生班

enum Grade{ A, B, C; }

class Student {

    private int studentId;
    private String studentName;
    private int rollNumber;
    private double totalMarks;
    private Grade grade;

    public Student(int studentId, String studentName)
    {
        this.studentId=this.rollNumber=studentId;
        this.studentName=studentName;
    }

    public Student(String studentName, int rollNumber)
    {
        this.studentId=this.rollNumber=rollNumber;
        this.studentName=studentName;
    }

    public int getStudentId() {
        return studentId;
    }

    public String getStudentName() {
        return studentName;
    }

    /**
     * @return the rollNumber
     */
    public int getRollNumber() {
        return rollNumber;
    }

    /**
     * @param rollNumber the rollNumber to set
     */
    public void setRollNumber(int rollNumber) {
        this.rollNumber = rollNumber;
    }    

    /**
     * @return the totalMarks
     */
    public double getTotalMarks() {
        return totalMarks;
    }

    /**
     * @param totalMarks the totalMarks to set
     */
    public void setTotalMarks(double totalMarks) {
        this.totalMarks = totalMarks;
        calculateGrade();
    }

    public void calculateGrade() {

        if(this.totalMarks >= 60) this.grade = Grade.A;

        else if(this.totalMarks > 40 && this.totalMarks < 60) this.grade = Grade.B;

        else this.grade = Grade.C;

    }

    private Grade getGrade() {
        return grade;
    }

    @Override
    public String toString() {
        return String.format("{name: %s, rollNumber: %d, totalMarks: %f, Grade: %s}", 
                studentName, 
                this.rollNumber,
                this.totalMarks,
                this.getGrade());
    }

    public boolean equals(Object obj) {

        if(obj instanceof Student) {
            Student student = (Student) obj;
            return student.rollNumber == this.rollNumber;
        }

        return false;
    }

    @Override
    public int hashCode() {
        return this.rollNumber;
    }
}
class StudentNameComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return o1.getStudentName().compareTo(o2.toString())*-1; //reverse ordering
    }

}

Java fiddle:

这里有几个问题需要解决:

  • 您的比较运算符不正确-它没有比较名称
  • 比较器必须与equals一致,才能执行set操作(有关详细信息,请参阅
    TreeSet
    的文档)
我建议您使用
Comparator
静态方法来构建比较,而不是实现自己的
compareTo
。更安全、更清晰:

Comparator<Student> nameOrder = Comparator.comparing(Student::getStudentName);

Set<Student> students = new TreeSet<>(nameOrder.reverse());
comparatornameorder=Comparator.comparing(Student::getStudentName);
Set students=new TreeSet(nameOrder.reverse());

这里有几个问题需要解决:

  • 您的比较运算符不正确-它没有比较名称
  • 比较器必须与equals一致,才能执行set操作(有关详细信息,请参阅
    TreeSet
    的文档)
我建议您使用
Comparator
静态方法来构建比较,而不是实现自己的
compareTo
。更安全、更清晰:

Comparator<Student> nameOrder = Comparator.comparing(Student::getStudentName);

Set<Student> students = new TreeSet<>(nameOrder.reverse());
comparatornameorder=Comparator.comparing(Student::getStudentName);
Set students=new TreeSet(nameOrder.reverse());

正如Shmosel所指出的,我比较了o1和o2上的getName()方法,更正了排序。比较器类应为:

class StudentNameComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return o1.getStudentName().compareTo(o2.getStudentName())*-1; //reverse ordering
    }

}
类StudentNameComparator实现Comparator{
@凌驾
公共整数比较(学生o1,学生o2){
返回o1.getStudentName().compareTo(o2.getStudentName())*-1;//反向排序
}
}

正如Shmosel所指出的,我比较了o1和o2上的getName()方法,更正了排序。比较器类应为:

class StudentNameComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return o1.getStudentName().compareTo(o2.getStudentName())*-1; //reverse ordering
    }

}
类StudentNameComparator实现Comparator{
@凌驾
公共整数比较(学生o1,学生o2){
返回o1.getStudentName().compareTo(o2.getStudentName())*-1;//反向排序
}
}

我想你的意思是
o2.getStudentName().toString()
。你是对的,谢谢你的观察。我想你的意思是
o2.getStudentName().toString()
。你是对的,谢谢你的观察。正如你正确指出的,比较操作是不正确的。我能够通过shmosel的更正按字母顺序进行排序。这正如预期的那样有效,但是,我正在进行的练习需要实现一个扩展comparator接口的自定义comparator。正如您正确指出的,比较操作是不正确的。我能够通过修改shmosel的代码按字母顺序进行排序。这正如预期的那样有效,但是,我正在进行的练习需要实现一个扩展comparator接口的自定义comparator。