Clojure API之數組操做

##一、建立數組## ###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

同系列的所有方法

  1. byte-array
  2. short-array
  3. int-array
  4. long-array
  5. float-array
  6. double-array
  7. char-array
  8. boolean-array
  9. object-array*

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

同系列所有方法

  1. aset-byte
  2. aset-short
  3. aset-int
  4. aset-long
  5. aset-float
  6. aset-double
  7. aset-char
  8. aset-boolean
  9. aset

###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###

  • bytes Casts to bytes[] Added in Clojure version 1.1
  • shorts Casts to shorts[] Added in Clojure version 1.1
  • ints Casts to int[] Added in Clojure version 1.0
  • longs Casts to long[] Added in Clojure version 1.0
  • floats Casts to float[] Added in Clojure version 1.0
  • doubles Casts to double[] Added in Clojure version 1.0
  • chars Casts to chars[] Added in Clojure version 1.1
  • booleans Casts 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》中看到。

相關文章
相關標籤/搜索