java中Lexography字符串比较背后的逻辑是什么?
我正在用java实现一个简单的比较器来按名称(altabely)对树集中的对象进行排序。结果与我预期的不同,我很难理解java的String compareTo()方法背后的逻辑。我的期望是字符串按字母顺序排列 下面是代码列表: 学生班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;
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。