1

次のような配列に個別の関数を実装しようとしていました。

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

毎回テールを配列に変換する必要があるのは好きではありません。そうしないと、コンパイラは、末尾が配列ではなく単なるシーケンスであると不平を言います。この場合、パターン マッチを改善することは可能ですか?

4

2 に答える 2

2

短い答えは、あなたができないということです。これらのものを新しいオブジェクトに抽出するように依頼していますが、適切なオブジェクトは実際には存在しません。

独自のエクストラクターと、配列と開始インデックスを保持するクラスを作成することもできますが、Scala には実際にはこれが組み込まれていません。このようにパターンマッチを行うと、テールごとに新しいオブジェクトが作成されます。

私の提案は組み込みのdistincton 配列を使用することですが、パターン マッチングを使用して独自に記述したい場合は、組み込みの変換 fromArray使用し、 orWrappedArrayを使用してより一般的な実装を実装します。SeqIndexedSeq

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