猿问

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

我正在实现一个简单的比较器,以在 Java 中按名称(按字母顺序)对 TreeSet 中的对象进行排序。结果与我的预期不同,我很难理解 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());

    }

慕神8447489
浏览 130回答 2
2回答

长风秋雁

这里有几个问题需要解决:您的比较运算符不正确 - 它不是比较名称你的comparator必须和equals一致才能实现set操作(详见文档TreeSet)我建议您使用Comparator静态方法来构建您的比较而不是实现您自己的compareTo.&nbsp;它更安全,更清晰:Comparator<Student>&nbsp;nameOrder&nbsp;=&nbsp;Comparator.comparing(Student::getStudentName); Set<Student>&nbsp;students&nbsp;=&nbsp;new&nbsp;TreeSet<>(nameOrder.reverse());

ITMISS

我比较了 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    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答