java 排序中的可比接口(interface)

标签 java collections compareto

我在集合中提出的问题是使用可比较的接口(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");

在此示例中obj1obj2不是同一个对象,并且本质上具有不同的 eId值(value)观。您传入 compareTo 的那个方法可能是 obj2例如,它与当前比较的 eId 不同。

所以当我们通过obj2时进入像这样的方法 compareTo(obj2) ,这意味着当它到达代码中 other.getEId 的部分时它将执行 obj2.getEId这显然会返回不同的 eIdeId在 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/

相关文章:

java - 使用 Tomcat7 服务器配置 SSL

java - Junit 保护方法

java - java中比较两个字符串 -compareTo

java - Hudson 的替代构建管理器

java - 如何在java中返回过滤后的Hashmap的值?

java - ArrayList 添加方法抛出 IndexOutOfBoundsException

java - 按字段分组并计算 java 8 中的非空字段

java - 使用数组按姓名和分数对学生进行排序

java - 如何使用compareTo比较字符串以按字母顺序获取名称而不是分数?

java - 为什么抽象实现由 Map.values() 返回?