当前位置: 首页 > 知识库问答 >
问题:

为什么sortBy的排序与Kotlin中的stream排序不同?

柴瀚昂
2023-03-14

我用Kotlin和Spring-Boot的应用程序中的一个接口自动连接了bean列表。

@Autowired
private var pages: List<Paging>

在post构造中,我按类的简单名称对bean进行排序

@PostConstruct
fun setUp(){
 pages.sortedBy { it.javaClass.simpleName }
 pages.forEach { log.info("{}", it::class.simpleName) }
}

我看到下一个结果

page.month.Page19M@69cf9dd
page.month.Page04@43be5d62
page.month.Page03@5d34e3b3
page.month.Page13@151b7c03
page.month.Page16@6e71c9dc
page.month.Page17@7fe14f94
page.month.Page12@1f502e65
page.month.Page18@7d4d32a7
page.month.Page07@65c29c4c
page.month.Page06@5387e079
page.month.Page15@249dd7e6
page.month.Page11@56f13088
page.month.Page14@29ef49a1
page.month.Page10@76dc4e
page.month.Page09@c59b505
page.month.Page01@30c6e2e
page.month.Page02w@46bde78e
page.month.Page05@7500f8f0
page.month.Page08@7c5810e4

bean不是按简单的名称排序的。

pages.stream()
     .sorted { o1, o2 -> o1.javaClass.simpleName.compareTo(o2.javaClass.simpleName) }
     .forEach { i -> log.info("{}", i.javaClass.simpleName) }
page.month.Page01@30c6e2e
page.month.Page02w@46bde78e
page.month.Page03@5d34e3b3
page.month.Page04@43be5d62
page.month.Page05@7500f8f0
page.month.Page06@5387e079
page.month.Page07@65c29c4c
page.month.Page08@7c5810e4
page.month.Page09@c59b505
page.month.Page10@76dc4e
page.month.Page11@56f13088
page.month.Page12@1f502e65
page.month.Page13@151b7c03
page.month.Page14@29ef49a1
page.month.Page15@249dd7e6
page.month.Page16@6e71c9dc
page.month.Page17@7fe14f94
page.month.Page18@7d4d32a7
page.month.Page19M@69cf9dd

我不明白为什么结果不一样。我试着用了一个类和一个字段-工作OK。

我错过了什么?

共有1个答案

姜杜吟
2023-03-14

Kotlin标准库中的sortedBy方法不执行就地排序。相反,它返回一个新的排序列表。

在共享的代码中,使用pages.sortedby{...}对列表进行排序,但忽略此操作的结果。因此,pages变量保持不变,并且当您使用foreach对其进行迭代时,得到的列表与之前相同。

如果对排序后的列表进行迭代,则会得到所需的结果:

val sortedPages = pages.sortedBy { page -> page.javaClass.simpleName }
sortedPages.forEach { sortedPage -> println(sortedPage) }

您可以通过直接对列表排序后返回的结果进行迭代来进一步缩短时间:

pages.sortedBy { page -> page.javaClass.simpleName }
     .forEach { sortedPage -> println(sortedPage) }

您可以试用此示例代码进行验证。

 类似资料:
  • 问题内容: 我最近从Python 2.7切换到Python 3.3,似乎在Python 2中字典键的顺序是任意的,但是是一致的,而在Python 3中,使用例如获得的字典键的顺序似乎是不确定的。 如果我运行: 在Python 2.7和Python 3.3中,则: Python 2.7一直给我 使用Python 3.3,我可以获得任何随机顺序–例如: [‘doc’, ‘dict’, ‘qualnam

  • 我决定问这里,这样我就能解决我的问题。在我写信给你之前,我可以向你保证,我在谷歌搜索了很多,但没有找到答案。 在我的PRIMEFACES中,p:DataTable中p:Column中的sortBy和filterBy不起作用。 让我们从SortBy开始。()在我尝试的所有版本中,如您在下面的pom.xml中所看到的:6.2,7.0,7.0.rc3,8.0,8.0.rc3中所示,它都有这样的行为:它显

  • 我有2列制表符分隔的整数,其中第一列是随机整数,第二列是标识组的整数,可以由此程序生成。() 然后,我使用第二个程序()计算每个组的和。 如果我在给定大小的数据集上运行这些程序,然后打乱相同数据集的行的顺序,打乱的数据计算总和的速度比有序数据快2倍或更多。 我本来希望按组排序的原始数据具有更好的数据局部性并且速度更快,但我观察到相反的行为。我想知道是否有人可以假设原因?

  • 我发现 比 Python 2 和 3 中的函数慢。 Python 2 蟒蛇 3 为什么<code>max</code>(<code>O(n)</code>)比<code>sort</code>函数(<code<O(nlogn)</code>)慢?

  • 我已经在链接中看到了(http://bigocheatsheet.com/)插入排序的复杂性与冒泡排序相同,堆排序也优于这两种排序。但是,当我创建一个示例程序并比较插入排序所花费的时间时,我感到难以置信。 类用于测试排序算法。 泡泡排序类 用于插入排序的类 堆排序类 用于创建数组的类 我尝试了所有的情况,比如最好的情况、最坏的情况和一般情况。但在所有情况下,插入排序都比冒泡排序和堆排序快得多。理论

  • 来自Javadoc的: 注:如果对象用作中的键或中的元素,则应小心操作,因为的自然顺序与等于的顺序不一致。 例如,如果您创建一个并向其中添加和,则该集合将包含两个元素(因为值具有不同的比例,因此根据和,它们是不相等的),但是,如果对