简体   繁体   English

反转clojure中的向量(noob)

[英]reverse a vector in clojure (noob)

Hi I just starting with Clojure and I cannot manage to reverse a vector of integers. 嗨,我刚开始使用Clojure,我无法设法反转整数向量。

;generate a vector of random integers
(defn generate-rands
  [x]
  (vector (take x (repeatedly #(rand-int 100))))
  )

;vector of integers
(def my-vector (generate-rands 10))

;reverse the vector of integers
(def my-vector-reversed (reverse my-vector))

;main
(defn main-app
  []  
  (println "My Vector: \t\t\t" my-vector)
  (println "My Vector Reversed: \t" my-vector-reversed))

The output is 输出是

=> (main-app)
My Vector:           [(14 49 29 3 66 7 60 60 34 19)]
My Vector Reversed:  [((14 49 29 3 66 7 60 60 34 19))]
nil
#'startingclojure.app/main-app

=> (vector? my-vector-reversed)
false

Can someone kindly explain me why my-vector-reversed is not a vector? 有人可以my-vector-reversed解释为什么my-vector-reversed不是矢量吗? And how can I reverse the content of 'my-vector'? 我怎样才能扭转'my-vector'的内容呢? Thanks 谢谢

Also, it's preferable to use rseq instead of reverse when you work with vector or sorted-map . 此外,当您使用vectorsorted-map时,最好使用rseq而不是reverse It has constant time, because they are indexed and can be efficiently walked in either direction. 它具有恒定的时间,因为它们被索引并且可以在任一方向上有效地行走。

from reverse's doc : 来自reverse的文档

Returns a seq of the items in coll in reverse order. 以相反的顺序返回coll中的seq项。 Not lazy. 不懒惰。

reverse turns anything into a seq, meaning, a list. 反向将任何东西变成seq,意思是列表。 in order to get back a vector you should turn it into a vector: 为了找回一个向量,你应该把它变成一个向量:

(into [] (reverse [1 2 3 4])) ; =>[4 3 2 1]

In your case, look at your "my-vector": [(14 49 29 3 66 7 60 60 34 19)] - its a vector containing a single element - a seq. 在你的情况下,看看你的“我的向量”:[(14 49 29 3 66 7 60 60 34 19)] - 它是一个包含单个元素的向量 - 一个seq。 so reversing it wouldnt change anything. 所以扭转它不会改变任何事情。 you should use the same technique to turn your seq into a vector: 你应该使用相同的技术将你的seq变成一个向量:

(defn generate-rands
  [x]
  (into [] (take x (repeatedly #(rand-int 100)))))

reverse function returns always a seq , not a vector. reverse函数总是返回seq ,而不是向量。 You can again convert the result into a vector with something like: (apply vector (reverse [1 2 3])) 您可以再次将结果转换为具有以下内容的向量:( (apply vector (reverse [1 2 3]))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM