3

我想知道是否有人可以帮助我理解如何在 clojure 中执行以下代码:

int[] secondArray = new int[500];

for (int i = 0; i < firstArray.length; i++) 
{
  secondArray[firstArray[i]] += 1;
}
4

2 回答 2

8

您可能可以使用该frequencies功能:

user=> (frequencies [:foo :bar :baz :foo :foo])
{:foo 3, :bar 1, :baz 1}
于 2013-02-27T20:41:21.267 回答
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 中的第一个元素,然后将结果传递给 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)的当前值。

于 2013-02-27T22:01:28.287 回答