【发布时间】:2018-03-25 00:01:35
【问题描述】:
我有一个元组列表,我想根据元组中的第二个元素对它进行升序排序。我用这段代码来做:
freqs.sortWith( _._2 < _._2 )
但我不喜欢 ._2 的命名,因为我希望给第二个参数取一个好听的名称,例如 freqs.sortWith( _.weight < _.weight )。
任何想法如何做到这一点?
【问题讨论】:
标签: scala
我有一个元组列表,我想根据元组中的第二个元素对它进行升序排序。我用这段代码来做:
freqs.sortWith( _._2 < _._2 )
但我不喜欢 ._2 的命名,因为我希望给第二个参数取一个好听的名称,例如 freqs.sortWith( _.weight < _.weight )。
任何想法如何做到这一点?
【问题讨论】:
标签: scala
您无需在sortWith 中重复所有内容,您可以改用sortBy(_._2)。
如果你想有一个好听的名字,创建一个自定义的case 类,它有这个名字的成员变量:
case class Foo(whatever: String, weight: Double)
val list: List[Foo] = ???
list.sortBy(_.weight)
只需要一行。
或者,您可以在本地“拉皮条”元组:
class WeightOps(val whatever: String, val weight: Double)
implicit def tupleToWeightOps(t: (String, Double)): WeightOps =
new WeightOps(t._1, t._2)
那么你可以直接在元组上使用.weight:
val list: List[(String, Double)] = ???
list.sortBy(_.weight)
不要忘记保持隐式范围尽可能小。
【讨论】:
_1 和 _2。如果一个实例有成员weight,那么它不能是Tuple2 类型。由于 Scala 中的每个值都是某个类的实例,因此在没有类的情况下编写富有表现力的代码有些困难。
_.weight。句点运算符. 在整个语言中基本上只有一个功能:它用于访问类的成员(它也可以用于选择没有明确定义关联包对象的包的成员,但这是挑剔的)。如果您只想对元组进行模式匹配,那很好,但它与访问类成员 weight 无关。
scala> val list: List[(String, Int)] = List (("foo", 7), ("bar", 3), ("foobar", 5))
list: List[(String, Int)] = List((foo,7), (bar,3), (foobar,5))
scala> list.sortBy {case (ignore, price) => price }
res70: List[(String, Int)] = List((bar,3), (foobar,5), (foo,7))
大小写提取器可用于将有意义的名称放在变量上。
【讨论】: