【问题标题】:Anonymous comparator function in scala with deconstructed tuples?scala中具有解构元组的匿名比较器功能?
【发布时间】:2018-03-25 00:01:35
【问题描述】:

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

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

但我不喜欢 ._2 的命名,因为我希望给第二个参数取一个好听的名称,例如 freqs.sortWith( _.weight &lt; _.weight )。 任何想法如何做到这一点?

【问题讨论】:

    标签: scala


    【解决方案1】:

    您无需在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)
    

    不要忘记保持隐式范围尽可能小。

    【讨论】:

    • 感谢您的回答,它有效,但我一直在寻找如何使用元组执行此操作,并编写更具表现力的代码,而不是类。
    • @themathmagician scala.Tuple2 正好有两个成员变量:_1_2。如果一个实例有成员weight,那么它不能是Tuple2 类型。由于 Scala 中的每个值都是某个类的实例,因此在没有类的情况下编写富有表现力的代码有些困难。
    • 是的,但问题是关于元组的——而不是类和访问类成员。由于它们是语言的一部分,我想以更具表现力的方式使用它们。似乎案例提取器可以完成这项工作。当然,你是绝对正确的,没有类的昂贵代码可能有点困难!
    • @themathmagician 元组类,它们只是在编译器中享有很高的特权。您的问题包含语法_.weight。句点运算符. 在整个语言中基本上只有一个功能:它用于访问类的成员(它也可以用于选择没有明确定义关联包对象的包的成员,但这是挑剔的)。如果您只想对元组进行模式匹配,那很好,但它与访问类成员 weight 无关。
    • 嗨@Andrey,感谢您的帮助,但我的问题是关于对元组成员而不是类成员的表达访问。现在我知道,一个案例提取器正在做的正是我的想法。完全不会反对类的有用性,但在我的情况下,元组不是我领域的自然部分,只是计算中的临时结果,它非常适合称为元组的“实用程序包”。
    【解决方案2】:
    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))
    

    大小写提取器可用于将有意义的名称放在变量上。

    【讨论】:

    • 嘿,我喜欢你的回答,而且我确实知道 sortBy 比 sortWith 短。但是如果我坚持使用sortWith,那我该怎么表达呢?
    猜你喜欢
    • 2012-05-08
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多