arrayListName.sort(null)做什么?

new*_*ode 7 java sorting arraylist

我有一个项目,教授给了我们一些代码.代码中有一行让我困惑:

arrayListName.sort(null); 
Run Code Online (Sandbox Code Playgroud)

这个电话sort(null)的确是做什么的?

该文档说:"如果指定的比较器为null,则此列表中的所有元素都必须实现Comparable接口,并且应该使用元素的自然顺序.此列表必须是可修改的,但不需要可调整大小." 这个列表的自然顺序是什么意思?我们尝试排序的元素是电话号码.

注意:我阅读了javadoc并且我不清楚这意味着什么.英语不是我的第一语言,教授不用英语授课.我试图谷歌问题,但我仍然感到困惑,具体是什么意思.

Zab*_*uza 5

解释

假设arrayListName实际上是一个 type 变量ArrayList,那么你在List#sort这里调用方法。从它的文档

default void sort(Comparator<? super E> c)

根据由指定的 引起的顺序对此列表进行排序Comparator

如果指定的比较器是,null则此列表中的所有元素都必须实现该Comparable接口,并且应使用元素的自然顺序

因此,当比较器为 时,该方法使用元素的自然顺序null

compareTo当它们实现接口Compareable文档)时,这种自然排序是由项目的方法给出的。对于int这种增加。对于String这种基于字典顺序的排序

使用自然排序排序后的示例:

1, 2, 3, 3, 3, 8, 11

"A", "B", "H", "Helicopter", "Hello", "Tree"
Run Code Online (Sandbox Code Playgroud)

许多类已经实现了这个接口。查看文档。它287当前计算类。


细节

让我们将其与实际实现进行比较:

@Override
@SuppressWarnings("unchecked")
public void sort(Comparator<? super E> c) {
    final int expectedModCount = modCount;
    Arrays.sort((E[]) elementData, 0, size, c);
    if (modCount != expectedModCount) {
        throw new ConcurrentModificationException();
    }
    modCount++;
}
Run Code Online (Sandbox Code Playgroud)

比较器c传递给方法Arrays#sort,让我们看一下其实现的摘录:

if (c == null) {
    sort(a, fromIndex, toIndex);
}
Run Code Online (Sandbox Code Playgroud)

我们跟随对另一个Arrays#sort方法(实现)的调用。此方法根据元素的自然顺序对元素进行排序。所以没有使用比较器。


小智 2

我输入它并没有抛出错误。它实际上正确地对列表进行了排序。这是我的代码:

ArrayList<Integer> nums = new ArrayList<Integer>();
nums.add(2);
nums.add(4);
nums.add(3);
nums.add(1);

System.out.println(nums);

nums.sort(null);
System.out.println(nums);
Run Code Online (Sandbox Code Playgroud)

输出是:

[2, 4, 3, 1]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

sort 方法接受 Comparator 对象,如果传递 null,则默认为自然排序。

  • 为什么会出乎意料呢?文档明确指出允许使用“null”作为比较器。然后,该方法默认为自然排序(如果可用)。 (4认同)
  • 好吧,如果有明确的记录,那就既不意外也不奇怪。就是这样…… (2认同)