【问题标题】:what does arrayListName.sort(null) do?arrayListName.sort(null) 做什么?
【发布时间】:2018-09-01 08:11:32
【问题描述】:

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

arrayListName.sort(null); 

sort(null) 的调用究竟做了什么?

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

注意:我阅读了 javadoc,但我不清楚它的含义。英语不是我的第一语言,教授也不用英语授课。我试图用谷歌搜索这个问题,但仍然对它的具体含义感到困惑。

【问题讨论】:

  • sort(null) 可能会抛出空指针异常(您阅读过文档吗?)。该排序方法应该做的是采用一个比较器,该比较器将用于对数组列表进行排序。
  • 我们需要知道arrayListName的类型才能回答这个问题。也许向我们展示更多代码会有所帮助。
  • 假设您知道arrayListName 的类型,我猜应该是ArrayList,您应该可以在线搜索此方法的Javadocs。
  • @new2code 使用该信息更新您的问题。它显示了您的努力,并且您尝试过思考这个问题,并且它给出了一个非常具体的问题,您被困在哪里,人们可以回答。一旦你这样做了,我会将我的反对票改为赞成票。
  • @MaxVollmer 谢谢你的建议。这是我第一次发布问题,所以我不确定什么是传达我的信息的最佳方式。

标签: java sorting arraylist


【解决方案1】:

说明

假设arrayListName实际上是ArrayList类型的变量,那么你这里调用的是List#sort方法。来自其documentation

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

根据指定的Comparator 诱导的顺序对该列表进行排序。

如果指定的比较器null,那么这个列表中的所有元素都必须实现Comparable接口并且应该使用元素的自然排序。 p>

所以当比较器为null时,该方法使用元素的自然排序

当项目实现接口Compareable (documentation) 时,此自然排序由项目上的compareTo 方法给出。对于int,这种情况正在增加。对于String,此排序基于lexicographical order

自然排序后的示例:

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

"A", "B", "H", "Helicopter", "Hello", "Tree"

很多类已经实现了这个接口。看看documentation。它目前计数287 个课程。


详情

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

@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++;
}

比较器c被传递给方法Arrays#sort,我们来看一段摘自它的implementation

if (c == null) {
    sort(a, fromIndex, toIndex);
}

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

【讨论】:

    【解决方案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);
    

    输出是:

    [2, 4, 3, 1]
    [1, 2, 3, 4]
    

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

    【讨论】:

    • 这有点……出乎意料。你可能会遇到一些微妙的错误。
    • 是的,没错
    • 为什么会出乎意料?文档明确指出允许使用null 作为比较器。然后该方法默认为自然排序(如果可用)。
    • @Zabuza 因为在处理null 时,您通常会得到NullPointerException。默认某些功能(这也要求元素实现Comparable)不是Java API 通常的工作方式。
    • 好吧,如果它被清楚地记录在案,它既不意外也不奇怪。就是这样……
    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多