Clojureで以下のコードを実行する方法を誰かが理解するのを手伝ってくれるかどうか疑問に思っていました:
int[] secondArray = new int[500];
for (int i = 0; i < firstArray.length; i++)
{
secondArray[firstArray[i]] += 1;
}
Clojureで以下のコードを実行する方法を誰かが理解するのを手伝ってくれるかどうか疑問に思っていました:
int[] secondArray = new int[500];
for (int i = 0; i < firstArray.length; i++)
{
secondArray[firstArray[i]] += 1;
}
おそらく次のfrequencies
関数を使用できます。
user=> (frequencies [:foo :bar :baz :foo :foo])
{:foo 3, :bar 1, :baz 1}
入力ベクトルをシーケンスとして扱い、それを目的の結果に縮小する、かなり直接的な変換を見てみましょう。
最初に、開始状態を含むいくつかの不変ベクトルを定義します。
boo> (def firstVector (vec (take 30 (repeatedly #(rand-int 10)))))
#'boo/firstVector
boo> firstVector
[9 0 4 5 0 7 3 9 0 0 6 6 5 5 9 4 0 1 3 6 4 9 5 8 8 3 4 6 7 6]
boo> (def secondVector (vec (take 10 (repeat 0))))
#'boo/secondVector
boo> secondVector
[0 0 0 0 0 0 0 0 0 0]
次にinc
、2 番目の配列の適切な要素である式が必要です。
boo> (assoc secondVector 4 (inc (secondVector 4)))
[0 0 0 0 1 0 0 0 0 0]
次に、その結果が firstVector の最初の要素に渡され、続いてその結果が firstVector の 2 番目の要素に渡されるようにします。reduce
関数はこれを行います:
boo> (reduce #(assoc %1 %2 (inc (%1 %2))) secondVector firstVector)
[5 1 0 3 4 4 5 2 2 4]
レデューサー関数の %1 (最初の引数) は現在の累積結果であり、%2 (2 番目の引数) は入力シーケンス (firstVector) からの現在の値です。