数组尾部的模式匹配

时间:2013-05-08 13:43:21

标签: scala

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

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

我不喜欢,我每次都要把尾巴变成阿瑞。否则编译器会抱怨tail只是一个序列而不是一个数组。在这种情况下,是否可以更好地模式匹配?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

我的建议是在数组上使用内置的distinct,但如果真的希望使用模式匹配编写自己的,我会使用内置的转换从ArrayWrappedArray,然后使用SeqIndexedSeq实现更通用的实现。

def distinct(a: Array[Int]): Array[Int] = distinct(a: Seq[Int]).toArray