可比较和比较器接口

时间:2014-09-11 08:28:52

标签: java sorting collections comparator comparable

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

请考虑以下代码段:

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行中, Collections.sort(lt)以list作为参数调用compareTo,其中Object作为参数接受列表lt。怎么样 ?不是compareTo必须有List作为参数。我知道List也是Object的类型,但是Object o将如何接受包含某个类实例的List。(请排除我现在不知道的泛型)

2)假设我调用 c1.comapreTo(c2)然后很清楚c1是这个对象而c2是另一个用于比较的对象。那么在comapreTo(对象o)中,以下行是清晰的

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

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

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

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

如果让每个查询都可以理解,那就太明显了。

1 个答案:

答案 0 :(得分:0)

在第3行中,Collections.sort将列表作为参数,compareTo(object o)由列表中的对象执行,作为列表中其他对象的参数。

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

当你调用collections.sort(lt)时,compareTo(Object o)用于执行orderig,并由列表中的其他对象作为参数的列表中的多个对象执行,它取决于集合的缩短算法。 sort()使用。

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

collections.sort()将一个参数与列表或列表以及比较器联系起来。