我想知道是否有人可以帮助我理解如何在 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
是第二个数组中的适当元素
boo> (assoc secondVector 4 (inc (secondVector 4)))
[0 0 0 0 1 0 0 0 0 0]
然后我们希望将结果传递给 firstVector 中的第一个元素,然后将结果传递给 firstVector 中的第二个元素,依此类推。该reduce
函数执行此操作:
boo> (reduce #(assoc %1 %2 (inc (%1 %2))) secondVector firstVector)
[5 1 0 3 4 4 5 2 2 4]
在 reducer 函数中,%1(第一个参数)是当前的累加结果,%2(第二个参数)是输入序列(firstVector)的当前值。