Collections.sort()方法如何在不调用“Name”类的方法的情况下整理出“Name”类实例的数组?

时间:2016-03-19 04:07:47

标签: java sorting collections

我是Java的新手,正在尝试学习Collections.sort()方法。我在Java Tutorial Oracle中看到了以下代码。在Collections.sort()类中调用NameSort方法后,名称数组将根据其姓氏和名字进行排序。但我没有看到类Name的hashcode(),equals()或compareTo()方法在任何地方被调用。 Collections.sort()方法如何在下面实际工作?有人可以向我解释一下吗?在此先感谢您的帮助!

名称等级

public class Name implements Comparable<Name> {
    private final String firstName, lastName;

    public Name(String firstName, String lastName) {
        if (firstName == null || lastName == null)
            throw new NullPointerException();
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String firstName() { return firstName; }
    public String lastName()  { return lastName;  }

    public boolean equals(Object o) {
        if (!(o instanceof Name))
            return false;
        Name n = (Name) o;
        return n.firstName.equals(firstName) && n.lastName.equals(lastName);
    }

    public int hashCode() {
        return 31*firstName.hashCode() + lastName.hashCode();
    }

    public String toString() {
    return firstName + " " + lastName;
    }

    public int compareTo(Name n) {
        int lastCmp = lastName.compareTo(n.lastName);
        return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
    }
}

NameSort类

public class NameSort {

    public static void main(String[] args) {
        Name[] nameArray = {
            new Name("John", "Smith"),
            new Name("Karl", "Ng"),
            new Name("Jeff", "Smith"),
            new Name("Tom", "Rich")
        };
        List<Name> names = Arrays.asList(nameArray);
        Collections.sort(names);
        System.out.println(names);


    }
}

3 个答案:

答案 0 :(得分:0)

要注意两件事:

1)您的Name类实现了Comparable接口。

2)它有一个compareTo方法。

当你将名字的arrayList传递给Collections类时,它会在内部迭代列表中的每个元素,并通过调用它来比较它们&#34; compareTo()&#34;方法

答案 1 :(得分:0)

  

Collections.sort()方法如何在不调用“Name”类的方法的情况下整理出“Name”类实例的数组?

没有。实际上,当需要比较一对compareTo对象时,它会调用Name方法。 Collections.sort(List)的{​​{3}}说:

  

“根据其元素的javadoc按升序对指定列表进行排序。列表中的所有元素都必须实现Comparable接口。”

Comparable接口指定compareTo方法,该方法提供javadoc引用的“自然排序”。这就是Name实现的支持排序等等。

其他方法(equalshashCodetoString)不用于排序。

答案 2 :(得分:0)

Collections.sort()方法的Javadoc已经具有实现细节,特别是:

  

实现注意:此实现遵循使用指定列表的List.sort(Comparator)方法和null   比较器。

List.sort()的Javadoc声明:

  

实施说明:

     

这个实现是一个稳定的,自适应的,迭代的mergesort   当输入数组为时,需要远低于n lg(n)的比较   部分排序,同时提供传统的表现   当输入数组随机排序时合并。如果是输入数组   几乎排序,实现需要大约n   比较。临时存储要求从一个小常数变化   对于几乎排序的输入数组,随机地为n / 2个对象引用   有序输入数组。

     

实施同样有利于升序和降序   在其输入数组中排序,并可以利用升序和   在同一输入数组的不同部分中降序排列。它是   非常适合合并两个或多个排序数组:简单地连接   数组并对结果数组进行排序。

     

该实现改编自Tim Peters的Python列表   (TimSort)。它使用了Peter McIlroy的“乐观主义”中的技巧   排序与信息理论复杂性“,在”论文集“中   第四届年度ACM-SIAM离散算法研讨会,第467-474页,   1993年1月。

为了更好地了解compareTo()等方法的使用方法,您还可以在每个方法中添加特定的System.out.println(...)跟踪语句,再次运行程序并查看输出。

如果您确实需要所有细节,那么您也会看到source code for List.sort()