maxBy() List() 中对象的多个属性

Posted

技术标签:

【中文标题】maxBy() List() 中对象的多个属性【英文标题】:maxBy() multiple attributes of objects in List() 【发布时间】:2021-12-09 16:22:20 【问题描述】:

假设我有一个书单

val books = List(Book)

Book(bookID: String, bookName: String) 的地址和地图

val scores = Map(bookID -> score:float)

我想先拿到score最高的书,然后按bookName的字母顺序排列

获得评分最高的书相当简单:

val bestBook = books.maxBy(x => score(x.bookID))

但如果多本书得分相同,我想按bookName 排序。我不确定如何向maxBy 添加第二个条件?我想我可以先maxBy() 得分,然后我检索bestBook 的得分,然后用最大得分过滤books,然后minBy() bookName

但这看起来真的很麻烦,有没有更有效的方法呢?我已经看到以前的线程与 Ordering 隐式执行类似的操作:Scala Ordering by multiple values,但我不知道如何在这种情况下定义 Ordering

【问题讨论】:

【参考方案1】:

同时使用maxBy 由较高的分数(感谢分数上的-)和名称:

books
  .maxBy(b => (-score(b.bookId), b.name))

如果需要,可以对元组使用相同的排序。

【讨论】:

啊我没想到,但就性能而言,sortBy 不是 O(nlog n) 而 maxBy 是 O(n)(我认为?) 对,您可以在元组上使用与maxBy 相同的方法。 不建议对简单的 max 操作进行排序。 好的,编辑了帖子:)

以上是关于maxBy() List() 中对象的多个属性的主要内容,如果未能解决你的问题,请参考以下文章

list中如何为一个对象附多个值

一个List,里面有多个对象,每个对象两个属性A,B ,都是String类型,怎么让这个List

java中如何将多个list集合对象拼接成一个集合对象

Java关于list集合根据集合元素对象的某个或多个属性进行排序的工具类

dataweave过滤器和嵌套数组列表上的maxBy

java list按照元素对象的指定多个字段属性进行排序