2009-07-20 34 views

Trả lời

14

Dường như các vectơ không thưa thớt nên bạn phải chỉ định giá trị cho mỗi chỉ mục khi tạo vectơ. Cách dễ nhất có vẻ là gọi (vec) trên một chuỗi.

(vec (repeat 1042 nil)) 

Các giá trị này không được tạo ra một cách lười biếng.

+0

điều này yêu cầu phiên bản mới nhất của clojure để cung cấp cho các đối số 2 lặp lại –

+0

những ngày này (2012) đây là câu trả lời đúng - bạn nên đánh dấu chính xác, arthur. –

+0

tôi sẽ nhận lời của bạn về điều đó :) –

4
(apply vector (take 1024 (repeat nil))) 

... là lười biếng

+2

Bạn có chắc chắn điều này là lười không? Mặc dù (mất 1024 (hủy bỏ nil)) chắc chắn là lười biếng, tôi nghĩ rằng (áp dụng vector ...) sẽ buộc đánh giá của trình tự đầy đủ. – mikera

+5

Vectơ không bao giờ lười. – amalloy

5

Nếu bạn muốn cái gì đó là không lười biếng nhưng mà tránh một số phí, bạn có thể làm:

(vec (make-array Object 1024)) 

Note, assoc không thay đổi một vector, nó trả về một vectơ mới với một trong các giá trị đã thay đổi. Vectơ là không thay đổi. Mã của bạn sẽ không bao giờ hoạt động như được đăng.

+0

cảm ơn đã chỉ ra rằng, tôi đã chỉnh sửa câu hỏi để lưu trữ mảng được trả về bởi ass –

+2

'make-array' trả về một mảng Java, nhưng gói nó trong' vec' làm cho nó thành một vector Clojure. –

5

Nếu dữ liệu của bạn thưa thớt, hãy xem xét sử dụng bản đồ trống thay vì vectơ .... khi đó bạn sẽ nhận được một số lượng chỉ mục trống không được phân bổ miễn phí!

(def a {}) 
(def b (assoc a 1041 42)) 
(b 1041) 
--> 42 
Các vấn đề liên quan