我正在實現一個簡單的比較器,以在 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()); }
2 回答

長風秋雁
TA貢獻1757條經驗 獲得超7個贊
這里有幾個問題需要解決:
您的比較運算符不正確 - 它不是比較名稱
你的comparator必須和equals一致才能實現set操作(詳見文檔
TreeSet
)
我建議您使用Comparator
靜態方法來構建您的比較而不是實現您自己的compareTo
. 它更安全,更清晰:
Comparator<Student> nameOrder = Comparator.comparing(Student::getStudentName); Set<Student> students = new TreeSet<>(nameOrder.reverse());

ITMISS
TA貢獻1871條經驗 獲得超8個贊
我比較了 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
? ? }
}
添加回答
舉報
0/150
提交
取消