java 排序中的可比较界面

java comparable interface in sorting

我在集合中想到的问题是使用可比界面构建我自己的默认排序顺序。我只想根据 eid 降序排列 (int eid,String ename)。所以这是我在comapreTo方法中无法理解的逻辑。

public class First implements Comparable<First> {

private final int eId;
private final String eName;

public First(int eId, String  eName){
    this.eId = eId;
    this.eName = eName;
}

public int getEId() {
    return eId;
}

public String toString(){
    return eName + "------" + eId;
}

public int compareTo(First obj){
    int eId1 = this.eId;
    First f = (First) obj;
    int eId2 = f.eId;
    if (eId1 < eId2){ 
        return -1;
    } else if (eId1 > eId2){
        return +1;
    } else {
        return 0;
    }
}}

请解释这是如何工作的,还有其他实现方式吗?

equals 方法和 ==!= 运算符测试 equality/inequality,但不提供测试相对值的方法。一些 classes(例如,String 和其他具有自然排序的 classes)实现了 Comparable 接口,该接口定义了 compareTo 方法。如果您想将 Comparable<T>Collections.sort()Arrays.sort() 方法一起使用,则需要在 class 中实现它。

你的比较方法欠缺,一个合适的例子是:

public int compareTo(First other){
    if (eId < other.getEId()){ 
        return -1;
    } else if (eId > other.getEId()){
        return +1;
    } else {
        return 0;
    }
}

通过输入 Comparable 界面,您可以知道比较的是哪种数据。这确保了正确的比较。您的示例可以 运行 很快变成 NullPointerException

please explain how this works

我猜你的问题基本上是,

Why do I need to implement the comparable interface to sort a list?

要对列表进行排序,您首先需要告诉 Java 如何比较两个对象。这样,Java就可以判断出哪个对象是"less",哪个对象是"greater"。使用此信息,然后可以按升序或降序对列表进行排序。

如何判断Java哪个大哪个小?

如果this大于other参数,return 1.如果this小于other参数,return -1。否则,return 0.

is there any other way of implementation?

实际上,您当前的 compareTo 方法无法编译。更好的实施方式是:

public int compareTo(First other){
    return Integer.compare(this.getEId(), other.getEId());
}

因为我还没有看到你对问题中提出的部分表示理解"how it works",所以我想你可能对此还不太清楚。根据您在某些答案中的评论,我发现您也不理解某些代码背后的 "logic" 。

我们将以 Mark Rotteveel 给出的示例来解释逻辑,因为我认为这是实现 compareTo 的一种不错的方式。

public int compareTo(First other){
if (eId < other.getEId()){ 
    return -1;
} else if (eId > other.getEId()){
    return +1;
} else {
    return 0;
}
}

我们让方法 compareTo 接收一个参数,该参数是类型 First 的对象 - 即您创建的 class。此类型包括您在此 class 中包含的所有属性,例如,有一个 getEId 方法允许您 return 您在您的文件中找到的私有全局变量 eId class First

现在问题是 compareTo 中的这个 other 参数是 First 对象的 自己的实例 ,而不是相同的您在 compareTo 方法内部比较的一个(这部分:if (eId < other.getEId()))。

compareTo 方法中,我们使用 if-else 语句来检查 eId(指的是您当前的全局变量 eId)是否为 eId是为作为参数传递给 compareTo 方法的 First 对象创建的。所以这两个不是同一个值.

正如您所说,您是编程新手,您可以这样想,您制作了一个具有构造函数的 class First

public First(int eId, String  eName){
this.eId = eId;
this.eName = eName;
}

然后您可以制作两个 不同的 First 对象:

First obj1 = new First(5, "Object 1");
First obj2 = new First(12, "Object 2");

在此示例中,obj1obj2 不是 同一对象,并且本质上具有不同的 eId 值。例如,您传递给 compareTo 方法的那个可能是 obj2,这将不同于它当前正在比较的 eId。

所以当我们将 obj2 传递给这样的方法时 compareTo(obj2),这意味着当它到达读取 other.getEId 的代码部分时,它将执行 obj2.getEId 这显然 return 与 if 语句中的 eId 不同 eId。在此示例中,'obj2.getEId' 它将 return 整数 12,因为如您所见,我之前将 obj2eId 设置为 12。

if-else 语句中的其余代码非常简单,如果您当前正在比较的 eId 的整数值较小,return -1else if 更大 return +1 将其向上或向下移动以根据 eId 对它们进行排序。 Return 在任何其他情况下为 0,因为在那种情况下它们在 eId.

方面是相等的

我希望从事物背后的逻辑以及 compareTo 中比较的 eId 的实例有何不同的角度来澄清代码。