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

cuxqih21  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(548)

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

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

现在,这段代码运行得很好,但是,在许多情况下,我所排序的特性与另一个示例具有相同的值。在本例中,java如何决定如何继续对列表排序?

kognpnkq

kognpnkq1#


除非你有特殊的理由,否则不要问这个问题(不仅仅是出于一般的善意,也因为不必要的问意味着你的申请很快就不能用于欧盟政府事务)。不妨养成忘记这一点的习惯)。
在本例中,java如何决定如何继续对列表排序?
如果两个物体被认为是“平等的”,那么发生什么取决于你在做什么。
为了 Collections.sort , Arrays.sort ,流,以及其他不保证唯一性的属性,排序顺序在这两者之间或多或少是“任意”的。
对于独特的概念,比如 TreeSet “,”on equal footing“表示相等,并且“on equal footing”不能在同一树集中。
我有一个名为instance的对象,有两个字段
请注意,可以链接比较器:如果比较器无法区分两个对象,可以告诉它使用另一个比较器:

Comparator<Instance> comparator = Comparator.comparingInt(Instance::getAge)
  .thenComparing(Comparator.comparing(Instance::getKind));
laximzn5

laximzn52#

引用javaapi Stream.sorted() :
对于有序流,排序是稳定的。对于无序流,不保证稳定性。
河上的小溪 List 是有序的,这意味着使用了稳定的排序算法。稳定的排序保证相等的元素不会被交换。比较相等的元素的相对顺序与起始列表中的相同。
标准库中的所有排序方法都有类似的保证: Collections.sort() Arrays.sort() Arrays.parallelSort() 这种排序保证是稳定的:相等的元素不会因为排序而重新排序。
...
此类中包含的方法的文档包括实现的简要描述。此类描述应被视为实现注解,而不是规范的一部分。只要遵循规范本身,实现者应该可以随意替换其他算法(例如 sort(Object[]) 不必是mergesort,但它必须是稳定的。) List.sort() 实施说明:
这个实现是一个稳定的,自适应的,迭代的。。。

相关问题