在clojure中计算向量中的唯一值

时间:2013-02-27 20:00:43

标签: clojure

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

int[] secondArray = new int[500];

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

2 个答案:

答案 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)。