2017-09-09 9 views
3

コードの前にdeclear "var"を入れずにループ関数を書く方法を学びたい。たとえば、interger配列で重複を削除したいとします。 C++/Javaでは、私はそのように行うことができます。配列内の複製を削除するスカラー方法

int removeDuplicate(vector<int> nums) 
{ 
    vector<int> output 
    Map<int,int> counter; 
    for(i = 0; i < nums.size(); i++) 
    { 
     if(!counter.has_key(nums[i])) 
     { 
      counter[nums[i]]=1; //add new key-value pair 
      output.push_back(nums[i]); 
     } 
    } 

    return output; 
} 

しかし、Scalaでは、どのように仕事上完了するために、不変の変数を使用します。

distinctなどのスカラの内部機能を使用しないでください。この質問はScalaの実装に関するものです。この場合、VARSの使用を避けるためにScalaで

+0

'distinct'は、メソッド、関数ではなく、私は推測あなたはそれを使用することを許可されていることを意味する?あなたのC++の例では、 'size()'、 'has_key()'、 'push_back()'、 'operator []'なども* "*内部関数"ですが、 *それらの* "内部機能"と他の "内部機能"とは何が違うのですか?とにかく "内部機能"は何ですか? –

答えて

7

あなたは再帰を使用するかfoldLeftまたはfoldRightことができます。

def distinct[A](list:List[A]):List[A] = 
    list.foldLeft(List[A]()) { 
    case (acc, item) if acc.contains(item) => acc 
    case (acc, item) => item::acc 
    } 
1

Scalaはライブラリ関数の多くを提供します。同様に、明確な機能があります。 直接呼び出すことができます。

scala> val array = Array(1,2,3,2,1,4) 
array: Array[Int] = Array(1, 2, 3, 2, 1, 4) 
scala> array.distinct 
res0: Array[Int] = Array(1, 2, 3, 4) 

とNOライブラリ関数が存在しない場合、我々は不変性を維持することができるように再帰主に末尾再帰を使用してコードを書くことを好みます。 配列をSetに変換して複製を削除し、配列を再度配列に変換して目的の結果を得ることができます。

scala> array.toSet.toArray 
res3: Array[Int] = Array(1, 2, 3, 4) 

スカラーでは、配列はスカラの可変コレクションであり、リストは不変であるため、配列よりもリストが優先されます。だからそれを使用することを好む。

+0

注目に値する。 '.toSet.toArray'は要素の順序を維持しません。 – jwvh

0

Scalaでこれを行う方法はいくつかあります(区別なし)。

使用
val x: Seq[Int] = Seq(1,2,3,3,4,5,6,6) 
val unique: Seq[Int] = x.groupBy(identity).keys.toSeq 

toSet:GROUPBYを使用して

:これらの選択肢の全ては不変変数を使用

val x: Seq[Int] = Seq(1,2,3,3,4,5,6,6) 
val unique: Seq[Int] = x.toSet.toSeq 
関連する問題