我想知道是否有人可以帮助我理解如何在clojure中执行以下代码:
int[] secondArray = new int[500];
for (int i = 0; i < firstArray.length; i++)
{
secondArray[firstArray[i]] += 1;
}
答案 0 :(得分:8)
您可以使用frequencies
功能:
user=> (frequencies [:foo :bar :baz :foo :foo])
{:foo 3, :bar 1, :baz 1}
答案 1 :(得分:0)
让我们通过一个相当直接的翻译,我们将输入向量视为一个序列,然后将其减少为所需的结果:
首先定义一些包含起始状态的不可变向量:
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中的frist元素,然后将结果传递给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)。