1

我试图在这样的数组上实现不同的函数:

def distinct(a: Array[Int]): Array[Int] = a match {
    case Array() => a
    case Array(head, tail @ _*) => head +: distinct(tail.toArray).filter(_ != head)
}

我不喜欢,每次都必须将 tail toArray 转换。否则编译器会抱怨 tail 只是一个序列而不是数组。在这种情况下是否可以更好地进行模式匹配?

4

2 回答 2

4

模式匹配不够性感,但我会这样:

def distinct(a: Array[Int]): Array[Int] = a match {
    case Array() => a
    case htail   => htail.head +: distinct(htail.tail).filter(_ != htail.head)
}
于 2013-05-08T13:52:01.940 回答
2

简短的回答是你不能。您要求它将这些东西提取到新对象中,但实际上并不存在合适的对象。

你可以编写自己的提取器和一个围绕数组加上起始索引的类,但 Scala 并没有真正内置它。无论如何,你不会真正获得数组的所有性能优势,因为你'当您像这样进行模式匹配时,会为每个尾部创建一个新对象。

我的建议是使用内置distinct数组,但如果您真的想使用模式匹配编写自己的,我会使用内置转换 from Arrayto ,然后使用orWrappedArray实现更通用的实现。SeqIndexedSeq

def distinct(a: Array[Int]): Array[Int] = distinct(a: Seq[Int]).toArray
于 2013-05-08T14:07:36.250 回答