2016-10-06 58 views
1

不同範圍組向量I具有如下形式的矢量反覆值的列表還使用的Clojure

([2.0 3.0] [2.0 4.0] [2.0 4.0] [2.0 12.0] [2.0 23.0] [2.0 6.0] [2.0 8.0] 
[1.0 5.0]p [1.0 9.0] [2.0 8.0] [2.0 16.0] [2.0 19.0] [2.0 13.0] 
[2.0 18.0] [1.0 23.0] [2.0 24.0] [2.0 22.0] [2.0 33.0] [2.0 27.0] 
[1.0 29.0] [2.0 32.0] [1.0 35.0] [2.0 39.0]) 

我在向量使用第二值希望將它們組到不同的範圍。

像分組((1-5)(6-10)..)

這裏的結果應與重複的值也

(([2.0 3.0] [2.0 3.0] [2.0 4.0] [2.0 4.0] [1.0 5.0]) 
([2.0 6.0] [2.0 8.0] [2.0 8.0] [1.0 9.0]) 
([2.0 12.0] [2.0 13.0]) 
([2.0 16.0] [2.0 18.0] [2.0 19.0]) 
([2.0 22.0] [1.0 23.0] [2.0 23.0] [2.0 24.0]) 
([2.0 27.0] [2.0 29.0]) 
([2.0 32.0] [2.0 33.0] [1.0 35.0]) 
([2.0 39.0])) 

當使用地圖,基通過它是不考慮重複的價值觀,只給予不同的看法。我希望所有的重複值也可以分組。

+0

收集到的值是你的問題輸入兩個代碼塊和表達的期望輸出你正在努力寫作? –

+0

@ArthurUlfeldt Yess! – joey

回答

1
(->> '([2.0 3.0] [2.0 4.0] [2.0 4.0] [2.0 12.0] [2.0 23.0] [2.0 6.0] [2.0 8.0] 
     [1.0 5.0] [1.0 9.0] [2.0 8.0] [2.0 16.0] [2.0 19.0] [2.0 13.0] 
     [2.0 18.0] [1.0 23.0] [2.0 24.0] [2.0 22.0] [2.0 33.0] [2.0 27.0] 
     [1.0 29.0] [2.0 32.0] [1.0 35.0] [2.0 39.0]) 
    (group-by (comp #(Math/ceil (/ % 5)) second)) 
    (sort-by first) 
    (map second)) 

第一組通過上舍入由5
除以第二數目的結果然後由地圖排序其鍵(地圖也是鍵值元組的列表)
然後映射second超過該只得到每個鍵

2

您可以使用group-by來計算存儲桶。

(defn bucket [v] 
    (Math/ceil (/ (second v) 5))) 

(defn my-grouping [vs] 
    (-> (group-by bucket vs) 
     (map (range 1.0 8.0)))) ; quick range hack, should calculate from input 

我不明白這應該如何只給出不同的值。

(I左正確的範圍內的計算作爲練習讀者。)

+0

我可以知道你如何在這裏定義'v'和'vs' – joey

+0

當我定義桶時,它說沒有匹配方法ceil。但是我知道ceil使用像(int(Math/ceil(/ 3 2)))。我是新的使用桶。 – joey

+0

@joey是他的'Math/ceil'調用被錯誤地使用了。他的最後一行也只適用於你的輸入限制第二個數字不超過40 –