当要比较对象的所选字段相等时,Java 如何决定对具有多个字段的对象列表进行排序?

Geo*_*cis 3 java sorting comparator

我有一个名为 Instance 的对象,它有 2 个字段,一个特征数组(这是另一个对象),表示数据集中的列,例如年龄、性别、类别等;和它们的值(即一个数字)。我还实现了一个自定义比较器,它可以根据实例的特定功能对这些对象的列表进行排序,如下所示:

Comparator<Instance> comparator = Comparator.comparing(c -> c.get(feature));
Instance[] sorted = instList.stream().sorted(comparator).toArray(Instance[]::new);
Run Code Online (Sandbox Code Playgroud)

现在,这段代码工作正常,但是,在很多情况下,我排序的特征与另一个实例具有相同的值。在这种情况下,Java如何决定如何继续对列表进行排序?

Joh*_*ica 6

引用 Java API 的内容Stream.sorted()

对于有序流,排序是稳定的。对于无序流,没有稳定性保证。

a 上的流List有序的,这意味着使用了稳定的排序算法。稳定的排序保证相等的元素不会被交换。比较相等的元素的相对顺序与起始列表中的相同。

标准库中的所有排序方法都有类似的保证:

  • Collections.sort()

  • Arrays.sort()

  • Arrays.parallelSort()

    这种排序保证是稳定的:相等的元素不会因排序而重新排序。

    ...

    此类中包含的方法的文档包括实现的简要说明。此类描述应被视为实现说明,而不是规范的一部分。只要遵守规范本身,实现者应该可以随意替换其他算法。(例如, 使用的算法sort(Object[])不一定是 MergeSort,但它必须是stable。)

  • List.sort()

    实现说明:
    这个实现是一个稳定的、自适应的、迭代的归并排序...