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,里面有多个对象,每个对象两个属性A,B ,都是String类型,怎么让这个List