Java compareTo方法初学者级别

时间:2019-01-03 12:57:57

标签: java comparable compareto

我有一个作业,我需要创建一个Student类,在其中存储学生的neptun代码(字符串nep_c)和您在考试中获得的分数(int point_num)。 准备一个公共的int getMark()方法,该方法根据下表将获得的票证作为得分的函数返回:

  • 介于100和90-> 5之间;
  • 90到80之间-> 4;
  • 介于80到70之间-> 3
  • 介于70和60之间-> 2
  • <60-> 1

该类实现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 ???;
}

}

5 个答案:

答案 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_cother.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种退货情况:

  • 0-如果您要比较的参数相等。
  • 任何正整数-如果参数大于对象,则为 从中调用该方法。
  • 任何负数-如果参数小于对象,则为 从中调用方法。

例如,如果此>参数,我使用-1,如果此=参数,我使用0,如果此<参数,我使用1。 然后,排序方法将负责根据方法的返回值对项目进行排序。 Here's an example