我有一个作业,我需要创建一个Student类,在其中存储学生的neptun代码(字符串nep_c)和您在考试中获得的分数(int point_num)。 准备一个公共的int getMark()方法,该方法根据下表将获得的票证作为得分的函数返回:
该类实现Comparable接口,并且compareTo()方法根据neptun代码对学生进行排序。在其中,根据您获得的分数数。 不幸的是,我不理解comperTo方法。您能帮我怎样编写正确的代码?
public class Student implements Comparable{
private String nep_c;
private int point_num;
private int Mark;
public Student(int point_num, String nep_c) {
this.point_num = 65;
this.nep_c= "AAA1BB1";
}
public int getMark(){
if (point_num <= 100 && point_num > 90)
Mark = 5;
else if (point_num <= 90 && point_num > 80)
Mark = 4;
else if (point_num <= 80 && point_num > 70)
Mark = 3;
else if (point_num <= 70 && point_num > 60)
Mark = 2;
else if (point_num <= 60)
Mark = 1;
else{
return 0;
}
return Mark;
}
public String getNep_c(){
return nep_c;
}
public int getPoint_num(){
return point_num;
}
@Override
public int compareTo (Object o){
return ???;
}
}
答案 0 :(得分:7)
根据海王星代码对学生进行排序
两个部分。第一部分,更改
implements Comparable
到
implements Comparable<Student>
然后
@Override
public int compareTo(Student o) {
return this.nep_c.compareTo(o.nep_c);
}
但是,您然后说在其中,按获得的分数数。所以也许您真的想要
@Override
public int compareTo(Student o) {
return Integer.compare(getMark(), o.getMark());
}
如果您打算按海王星代码排序,并使用标记作为平局,那么您可以做类似的事情
int c = this.nep_c.compareTo(o.nep_c);
if (c != 0) {
return c;
}
return Integer.compare(getMark(), o.getMark());
或者,在Java 8+中,使用Comparator.comparing
return Comparator.comparing(Student::getNep_c)
.thenComparingInt(Student::getMark).compare(this, o);
答案 1 :(得分:2)
compareTo
之所以获得Object
是因为您实现了Comparable
,而不是通用的Comparable<Student>
。这就是为什么很难看到需要做什么的原因。
如下更改代码:
public class Student implements Comparable<Student> {
...
@Override
public int compareTo(Student other) {
...
}
}
现在,在实现内部,将此学生的nep_c
与other.nep_c
进行比较。如果这两个不相等,则返回比较结果;否则,返回0。否则返回比较标记的结果。
注意:您的getMark
方法存在问题:它为60分的学生返回1
,而该分数应返回2,并且还会分配私有{{ 1}}字段,可以将其转换为局部变量。
答案 2 :(得分:2)
compareTo
上的Comparable
方法采用一个与当前对象进行比较的值,并应返回:
{
"data":{
"buttonText":"\u067e\u06cc\u0634 \u0628\u06cc\u0646\u06cc \u06a9\u0646!",
"buttonTextColorCode":"#000000",
"buttonBackgroundColorCode":"#7ca2d246",
"visibility":true,
"indexURL":"XXXXXX",
"authURL":"XXXXX",
"module":"MATCH_PREDICTION",
"alignment":"RIGHT_TOP",
"marginTop":"10",
"marginLeft":"10",
"marginRight":"10",
"marginBottom":"10",
"allowChannels":[
"22",
"52",
"10"
]
},
"success":true
}
,如果当前对象位于另一个对象之前(可以使用任何负整数),-1
,如果两个对象相等,0
,如果当前对象位于另一个对象之后(可以使用任何正整数)。如果要通过两个不同的字段比较两个对象,请执行以下操作(确保实现1
):
Comparable<Student>
比较数字时,从当前数字中减去另一个会得到升序,所以:
@Override
public int compareTo(Student other) {
final int comparedNepCode = nep_c.compareTo(other.nep_c);
if (comparedNepCode == 0) {
return Integer.compare(getMark(), other.getMark());
}
return comparedNepCode;
}
<=> x < y
x - y < 0
<=> x = y
x - y = 0
<=> x > y
答案 3 :(得分:0)
See the Java compaterTo withibn Comparable for info
compareTo是一个应返回整数的函数。这个想法是(例如)任何外部排序算法都使用此算法将一个对象(在您的情况下为Student类型)与另一个对象进行比较。在排序例程中(您可能不会编写:它内置于大学中),它需要一种方法来找出与另一个学生相比“最高”的方法,这就是compareTo提供的。
因此,在您的情况下,在compareTo中,就像...
params[:apartment]
(顺便说一下,这不是Java代码)
请注意,compareTo实际上并不进行排序。为此,您需要一些Student对象的Collection(一种数组类型)。 Collection对象应该内置有一个'.sort'方法。
关于哪种收藏:取决于您的需要。 Google是您的朋友:-)
答案 4 :(得分:0)
compareTo方法用于通过在方法主体中指定要比较的参数来比较两个对象。但是我想您已经了解了那部分。
您将不得不基于要进行的比较返回一个整数值。有3种退货情况:
例如,如果此>参数,我使用-1,如果此=参数,我使用0,如果此<参数,我使用1。 然后,排序方法将负责根据方法的返回值对项目进行排序。 Here's an example