java - 比较器和比较器接口(interface)

标签 java sorting collections comparator comparable

当我浏览上述接口(interface)时,在阅读了许多有关同一主题的网站后,我对这些接口(interface)的语法不太清楚。

考虑以下代码片段:

public class ComparableTest implements Comparable,Comparator {

    String name;
    int age;

    public ComparableTest(String name,int age){
        this.name=name;
        this.age=age;
    }
    @Override
    public int compareTo(Object o){               // line 1
        ComparableTest c=(ComparableTest)o;
        return name.compareTo(c.name);            // line 2
    }
@Override
public int compare(Object o1, Object o2){        // line 4
    ComparableTest c1=(ComparableTest)o1;
    ComparableTest c2=(ComparableTest)o2;
    return return c1.name.compareTo(c2.name);
}

    public static void main(String[] args) {
        ComparableTest ct1=new ComparableTest("Max",23);
        ComparableTest ct2=new ComparableTest("Alex",22);
        ComparableTest ct3=new ComparableTest("Zen",25);
        List lt=new ArrayList();
        lt.add(ct1);
        lt.add(ct2);
        lt.add(ct3);
        Collections.sort(lt);                                 // line 3
        Collections.sort(lt,new ComparableTest("jack",98));   // line 5
    }
}

1) 在第 3 行中,以 list 作为参数的 Collections.sort(lt) 调用以 Object 作为参数的compareTo 接受列表 lt。如何 ? CompareTo 不是必须有一个列表作为参数吗?我知道 List 也是 Object 的类型,但是 Object o 将如何接受包含某个类的实例的 List。(请排除泛型,因为我现在不知道)

2)假设我调用c1.comapreTo(c2),那么很明显c1是这个对象,c2是另一个用于比较的对象。因此,在 comapreTo(Object o) 中,以下行非常清晰

public int compareTo(Object o) {
     //cast the Object o
     return c1.name.compareTo(c2.name);
}

但是在第 2 行中,我只编写了 name.compareTo(c.name) 并进行了比较。这里的name指的是什么。 排序是如何进行的?我读到它是当前对象,但我们使用 Collections.sort 调用compareTo,而不是使用任何对象。

3) 当第 5 行调用第 4 行时,第 4 行将 list lt 作为 o1,将新创建的对象作为 o2。我不明白要排序的对象在列表中,那么为什么我们要传递一些不同的对象并与它进行比较,因为它不在列表中,也不会包含在我们的结果中。 这里是如何排序的?

4) 我们可以为第 5 行中的第二个参数传递哪些不同的值?

如果让每个查询都易于理解,那就太好了。

最佳答案

第 3 行 Collections.sort 接受一个列表作为参数,compareTo(object o) 由列表中的对象执行,并以列表中的其他对象作为参数。

第2行中的name是执行该方法的对象的属性名称。

当您调用collections.sort(lt)compareTo(Object o)用于进行排序并由列表中的多个对象以列表中的其他对象作为参数执行时,它取决于collections.sort()使用的短路算法。

例如,在只有两个对象的列表 l 中,调用 collections.sort(l) 将使一个对象以另一个对象为参数执行compareTo(Object o),并且列表将按顺序排列。更大的列表将需要更多的调用。

collections.sort() 接受一个参数、一个列表或一个列表和一个比较器。

关于java - 比较器和比较器接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25782687/

相关文章:

java - 使用 JPanel.paintComponent() 绘制两个正方形 - 尺寸错误

java - 如果用户已登录(使用 JSTL <if> 语句),如何检查 JSP 并显示用户名?

java - 使用基于字符串中字符的比较器对字符串数组进行排序

arrays - 如何使用 Vue.js 2 按日期对数组进行排序

基于Set类型的Java流过滤器

java - JLabel:重写 paintComponent() 之后。如何让 setText() 呈现文本字符串?

java - Karaf OSGi 配置抛出 ResolutionException : Unable to resolve root: missing requirement [root] osgi. 身份;

javascript - 根据js中的值对对象进行排序

java - java.util.Collections.contains() 如何比线性搜索执行得更快?

java - 集合框架和数据结构