如何按字母顺序比较scala元组?

las*_*aro 17 scala tuples

鉴于两个相同的元组,我如何按字典顺序比较它们?看起来这应该像下面的代码片段一样简单,但事实并非如此.任何简单的例子如何做到这一点?

var x = (1,2,3) < (1,2,4)
Run Code Online (Sandbox Code Playgroud)

如果他们列出,我可以定义一个递归函数,比较列表的头部直到找到差异或列表的结尾,但我不认为我可以为元组做到这一点.

Dan*_*ral 23

这并不简单,因为虽然

var x = (1,2,3) < (1,2)
Run Code Online (Sandbox Code Playgroud)

看起来很简单,

var x = (1,false,3) < (1,2)
Run Code Online (Sandbox Code Playgroud)

不是.你如何处理非订购类型?你如何处理同一元组位置的不同类型?

你要求所有类型都一样吗?在这种情况下,你没有元组.元组的重点是它的arity是固定的(你静态知道它有多大),每个元素可以是不同的类型.

如果我发现自己遇到了这个问题 - 而且我会努力不去 - 我会抓住Shapeless,将元组转换成像HLists这样的东西,然后尝试比较.

编辑

啊,现在它更容易:

import scala.math.Ordering.Implicits._
var x = (1,2,3) < (1,2,4)
Run Code Online (Sandbox Code Playgroud)

这些额外的含义不会自动提供,因为在某些情况下它们会导致不同的含义.


sch*_*mmd 13

如果您想使用Daniel的解决方案,<但如果您需要一种compare方法,则可以执行以下操作(例如).

implicitly[Ordering[Tuple2[Int, Int]]].compare((1,2), (2,3))
Run Code Online (Sandbox Code Playgroud)

为具有可比较部分的所有元组定义了排序.