我在集合中提出的问题是使用可比较的接口(interface)构建我自己的默认排序顺序。我想仅根据 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;
}
}}
请解释一下这是如何工作的,还有其他实现方式吗?
最佳答案
由于我还没有看到您对问题中询问“它是如何工作的”部分表示理解,我想您可能仍然不清楚这一点。根据您在某些答案中的评论,我发现您也不理解某些代码背后的“逻辑”。
我们将采用 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
的对象的参数- 这是您创建的类。此类型包括您已包含在此类中的所有属性,例如 getEId
允许您返回私有(private)全局变量 eId
的方法您在类(class)中找到的 First
。
现在的事情是这样的 other
compareTo
中的参数它是 First
的自己的实例对象,与您在 compareTo
中比较的对象不同方法(本部分:if (eId < other.getEId())
)。
compareTo
内方法中我们使用 if-else 语句来检查 if eId
(指当前的全局变量 eId
)到 eId
这是为 First
创建的作为参数传递给 compareTo
的对象方法。所以这两个值不同。
正如你所说,你是编程新手,这样想吧,你做了一个类(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");
在此示例中obj1
和obj2
不是同一个对象,并且本质上具有不同的 eId
值(value)观。您传入 compareTo
的那个方法可能是 obj2
例如,它与当前比较的 eId 不同。
所以当我们通过obj2
时进入像这样的方法 compareTo(obj2)
,这意味着当它到达代码中 other.getEId
的部分时它将执行 obj2.getEId
这显然会返回不同的 eId
比eId
在 if 语句内。在此示例中'obj2.getEId
' 它将返回整数 12,因为如你所见,我设置了 eId
12 表示 obj2
早些时候。
if-else 语句中的其余代码非常简单,如果 eId
您当前正在比较的整数值较小,return -1
, else if
它更大return +1
向上或向下移动以根据 eId
对它们进行排序。在任何其他情况下返回 0,因为在这种情况下它们在 eId
方面相等。 .
我希望能够在事物背后的逻辑以及eId
的实例如何解释代码方面有所澄清。在compareTo
内进行比较是不同的。
关于java 排序中的可比接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39544667/