##一、建立數組## ###1.1 從集合建立數組 into-array### into-arrayjava
(into-array aseq)
(into-array type aseq)git
返回包含aset中全部元素的數組。數組的組件類型爲type(若是指定了type),或aset中第一個元素的類型(若是aset不爲空),或Object。aset中全部元素的類型必須兼容數組的組件類型。type可使用基本類型的類對象,例如Integer/TYPE等。github
Added in Clojure version 1.0
Source算法
(into-array aseq)數組
(into-array []) ; #<Object[]> - [] (into-array [1 2 3]) ; #<Long[]> - [1, 2, 3],注:into-array返回的不是原生數組,而是引用數組
(into-array type aseq)函數
(into-array Integer/TYPE [1 2 3]) ; #<int[]> - [1, 2, 3] ; 等效於(int-array [1 2 3])
###1.2 建立空數組 make-array### make-array性能
(make-array type len)
(make-array type dim & more-dims)3d
建立並返回一個指定類型、指定尺寸的數組。須要注意是類對象是必需的。類對象能夠經過導入或徹底限定名稱得到。type可使用基本類型的類對象,例如Integer/TYPE等。code
Added in Clojure version 1.0
Source對象
(make-array type len)
(make-array Integer/TYPE 10) ; #<int[]> - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ; 等效於(int-array 10)
(make-array type dim & more-dims)
(make-array Integer/TYPE 2 10) ;二維數組 #<int[][]> - [[I@4b8bc0fb, [I@442ac57c] (make-array Integer/TYPE 2 2 10) ;三維數組 #<int[][][]> - [[[I@17f7b44f, [[I@75ebad4]
###1.3 建立基本類型數組 int-array ### int-array
(int-array size-or-seq)
(int-array size init-val-or-seq)
建立一個int數組
Added in Clojure version 1.0
Source
同系列的所有方法
object-array只有(object-array size-or-seq)用法
(int-array size)
(int-array 3) ; #<int[]> - [0, 0, 0] ; 至關於(make-array Integer/TYPE 3)
(int-array seq)
(int-array [1 2 3]) ; #<int[]> - [1, 2, 3] ; 至關於(into-array Integer/TYPE [1 2 3])
(int-array size init-val)
(int-array 3 5) ; #<int[]> - [5, 5, 5]
(int-array size seq)
(int-array 5 [1 2 3]) ; #<int[]> - [1, 2, 3, 0, 0] (int-array 5 [1 2 3 4 5 6 7]) ; #<int[]> - [1, 2, 3, 4, 5]
##二、 訪問和修改數組##
###2.1 訪問數組的值 aget### aget
(aget array idx)
(aget array idx & idxs)
返回指定索引的值。可用於全部類型的Java數組。(等效於array[idx])
Added in Clojure version 1.0
Source
(let [arrs (into-array [(int-array [1 2 3]) (int-array [11 12 13 14 15])])] ; #<int[][]> [[1, 2, 3], [11, 12, 13, 14, 15]] (println (aget arrs 0 2)) ; 3 (println (aget arrs 1 4))) ; 15
###2.2 修改數組的值 aset### aset
(aset array idx val)
(aset array idx idx2 & idxv)
用指定的元素替代數組中索引位置上的元素。可用於引用類型的Java數組。返回val。
Added in Clojure version 1.0
Source
(aset array idx val)
(let [arr (object-array ["A" "B" "C" "D" "E"]) ; [A, B, C, D, E] val (aset arr 2 "F")] (println val)) ; arr: [A, B, F, D, E] ; val: F
(aset array idx idx2 & idxv)
// Java public static Object[][][] arr3d = { { { "A", "B", "C", "D", "E" }, { "1", "2", "3", "4", "5" } }, { { 'a', 'b', 'c', 'd', 'e' }, { 11, 12, 13, 14, 15 } } };// 用Clojure初始化多維數組實在是太蛋疼了 ; clojure (let [val1 (aset arr3d 0 0 0 "val1") val2 (aset arr3d 0 1 0 "val2") val3 (aset arr3d 1 0 0 "val3") val4 (aset arr3d 1 1 0 "val4")] (println (java.util.Arrays/toString (aget arr3d 0 0))) (println (java.util.Arrays/toString (aget arr3d 0 1))) (println (java.util.Arrays/toString (aget arr3d 1 0))) (println (java.util.Arrays/toString (aget arr3d 1 1)))) ; [val1, B, C, D, E] ; [val2, 2, 3, 4, 5] ; [val3, b, c, d, e] ; [val4, 12, 13, 14, 15]
aset-int
(aset-int array idx val)
(aset-int array idx idx2 & idxv)
用指定的元素替代數組中索引位置上的元素。可用於int類型的Java數組。返回val。
Added in Clojure version 1.0
Source
同系列所有方法
###2.3 計算數組長度 alength###
alength
(alength array)
返回Java數組的長度。可用於全部類型的數組。
Added in Clojure version 1.0
Source
(alength (char-array 11 \a)) ; 11 ; 等效於(count (char-array 11 \a))
###2.4 使用Clojure序列庫###
####2.4.1 通用版序列庫####
(map #(Character/toUpperCase %) (.toCharArray "Clojure")) ; clojure.lang.LazySeq
####2.4.2 數組專用序列庫 amap, areduce#### amap 宏
(amap a idx ret expr)
用表達式expr映射數組a。使用一個索引idx,和一個返回值ret,並將ret初始化爲數組a的克隆,而後將ret的每個元素應用於expr表達式,(用表達式的返回值替換ret當前值)最後返回新的ret數組。
Added in Clojure version 1.0
Source
; 爲數組的每一個值加2 (let [arr (int-array [1 2 3]) ret (amap arr idx ret (do (println "=" (vec ret)) (+ 2 (aget ret idx))))] (println (vec ret)))
areduce 宏
(areduce a idx ret init expr)
用表達式expr概括數組a。使用一個索引idx,和一個返回值ret,將ret初始化爲init,將ret設置爲expr表達式每一步的計算結果,最後返回ret。
Added in Clojure version 1.0
Source
; 計算數組[1, 2, .., 100]每一個元素的和 (let [arr (int-array (range 1 101)) ret (areduce arr idx ret 0 (+ ret (aget arr idx)))] (println ret)) ; 5050
##三、 其餘## ###3.1 類型轉換 ints###
Casts to bytes[]
Added in Clojure version 1.1Casts to shorts[]
Added in Clojure version 1.1Casts to int[]
Added in Clojure version 1.0Casts to long[]
Added in Clojure version 1.0Casts to float[]
Added in Clojure version 1.0Casts to double[]
Added in Clojure version 1.0Casts to chars[]
Added in Clojure version 1.1Casts to boolean[]
Added in Clojure version 1.1引用類型能夠用to-array
###3.2 數組克隆 aclone### aclone
(aclone array)
返回Java數組的拷貝。可用於已知類型的數組。
Added in Clojure version 1.0
Source
##四、總結## 生活中一怕沒有選擇,二怕選擇過多。建立數組的方法太多也會使思惟混亂。通常而言對於引用類型的對象,使用集合容器遠優於使用數組。因此使用數組的場景就只有處理基本類型數據(而且對性能有必定要求)的狀況了,所以我的推薦優先使用int-array等方法建立數組。 花了一天時間,翻了好幾本書,幾乎找遍了與數組相關的全部方法,但願沒有遺漏的。Clojure數組專題到此爲止,以後會繼續以專題的形式總結其餘的API。
========2013/11/4 Clojure操做多維數組的aset, aget性能簡直讓人沒法直視,用來寫算法仍是算了吧。
========2013/12/8 直接使用into-array函數返回的不是原生數組,而是一個引用數組。若是要用into-array建立原生數組,必須指定類型(第一個參數)。以前沒注意這個,在《The Joy Of Clojure》中看到。