我有一个名为instance的对象,有两个字段,一个表示数据集中列的特征数组(这是另一个对象),例如年龄、性别、类别等;以及它们的值(即数字)。我还实现了一个自定义比较器,它可以根据示例的特定功能对这些对象的列表进行排序,如下所示:
Comparator<Instance> comparator = Comparator.comparing(c -> c.get(feature));
Instance[] sorted = instList.stream().sorted(comparator).toArray(Instance[]::new);
现在,这段代码运行得很好,但是,在许多情况下,我所排序的特性与另一个示例具有相同的值。在本例中,java如何决定如何继续对列表排序?
2条答案
按热度按时间kognpnkq1#
性
除非你有特殊的理由,否则不要问这个问题(不仅仅是出于一般的善意,也因为不必要的问意味着你的申请很快就不能用于欧盟政府事务)。不妨养成忘记这一点的习惯)。
在本例中,java如何决定如何继续对列表排序?
如果两个物体被认为是“平等的”,那么发生什么取决于你在做什么。
为了
Collections.sort
,Arrays.sort
,流,以及其他不保证唯一性的属性,排序顺序在这两者之间或多或少是“任意”的。对于独特的概念,比如
TreeSet
“,”on equal footing“表示相等,并且“on equal footing”不能在同一树集中。我有一个名为instance的对象,有两个字段
请注意,可以链接比较器:如果比较器无法区分两个对象,可以告诉它使用另一个比较器:
laximzn52#
引用javaapi
Stream.sorted()
:对于有序流,排序是稳定的。对于无序流,不保证稳定性。
河上的小溪
List
是有序的,这意味着使用了稳定的排序算法。稳定的排序保证相等的元素不会被交换。比较相等的元素的相对顺序与起始列表中的相同。标准库中的所有排序方法都有类似的保证:
Collections.sort()
Arrays.sort()Arrays.parallelSort()
这种排序保证是稳定的:相等的元素不会因为排序而重新排序。...
此类中包含的方法的文档包括实现的简要描述。此类描述应被视为实现注解,而不是规范的一部分。只要遵循规范本身,实现者应该可以随意替换其他算法(例如
sort(Object[])
不必是mergesort,但它必须是稳定的。)List.sort()
实施说明:这个实现是一个稳定的,自适应的,迭代的。。。