我正在实现一个简单的比较器,以在 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
提交
取消