我是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);
}
}
答案 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
实现的支持排序等等。
其他方法(equals
,hashCode
和toString
)不用于排序。
答案 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()