首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sorted和sortBy之间的区别

sorted和sortBy之间的区别
EN

Stack Overflow用户
提问于 2013-05-07 17:19:21
回答 3查看 203关注 0票数 4

根据列表的文档

代码语言:javascript
复制
def  sorted[B >: A](implicit ord: math.Ordering[B]): List[A] 
Sorts this list according to an Ordering.


def sortBy[B](f: (A) ⇒ B)(implicit ord: math.Ordering[B]): List[A]

Sorts this List according to the Ordering which results from transforming an implicitly given Ordering with a transformation function.

你什么时候用一个,什么时候用另一个?一个覆盖了一个场景,而另一个没有覆盖吗?

EN

回答 3

Stack Overflow用户

发布于 2013-05-07 17:22:45

对于sortBy,您可以提供生成用于排序的元素的自定义函数(例如,按长度字符串排序),而对于排序,您不能:

代码语言:javascript
复制
val xs = List("aa", "b")
// xs: List[String] = List(aa, b)
xs.sortBy{ str => str.length }
// List[String] = List(b, aa)

// now usual lexicographical sorting
xs.sorted
// List[String] = List(aa, b)
xs.sortBy(x => x)
// List[String] = List(aa, b)
xs.sortBy(identity)
// List[String] = List(aa, b)

如您所见,最后三行的结果是相同的

票数 6
EN

Stack Overflow用户

发布于 2013-05-07 17:47:16

如果您必须考虑多个情况,则可以将sortedOrdering一起使用。假设我们想要对以下开头字符串最短的列表进行排序。

代码语言:javascript
复制
val xs = "aa" :: "b" :: "bb" :: "a" :: Nil

xs.sortBy(_.length)
> List[String] = List(b, a, aa, bb)

如果我们还想按字母顺序对它们进行排序,当它们具有相同的长度时,我们可以使用sorted

代码语言:javascript
复制
xs.sorted(math.Ordering[(Int, String)].on((x: String) => (x.length, x)))
> List[String] = List(a, b, aa, bb)

但话又说回来,我们可以用

代码语言:javascript
复制
xs.sortBy(x => (x.length, x))
> List[String] = List(a, b, aa, bb)

也是。

其思想是,您可以为自己的类型提供Ordering类型类,然后具有这种隐式Ordering的简单xs.sorted将适用于最常见的用例。

票数 3
EN

Stack Overflow用户

发布于 2013-05-07 17:29:10

作为对@om-nom-nom答案的补充,here是这两种用法的典型用法示例:

代码语言:javascript
复制
val xs = List(4, 2, 3, 1)
val ys = List((1, 1), (3, 2), (2, 3))
println(xs.sorted)       // List(1, 2, 3, 4)
println(ys.sortBy(_._1)) // List((1,1), (2,3), (3,2))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16415467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档