带有解构元组的scala中的匿名比较器函数?

时间:2018-03-25 00:01:35

标签: scala

我有一个元组列表,我想根据元组中的第二个元素进行升序排序。我用这段代码做到了:

freqs.sortWith( _._2 < _._2 )

但是我不喜欢._2命名,因为我希望第二个参数有一个很好的名字,比如freqs.sortWith( _.weight < _.weight )。 任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:5)

您不需要在sortWith内重复所有内容,您可以使用sortBy(_._2)代替。

如果您想拥有一个好名字,请创建一个具有此名称成员变量的自定义case类:

case class Foo(whatever: String, weight: Double)

val list: List[Foo] = ???
list.sortBy(_.weight)

只需一行。

或者,你可以&#34;皮条客&#34;本地元组:

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 :(得分:3)

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))

案例提取器可用于在变量上放置有意义的名称。