Clojure 学习入门(19)—— 数组
1、创建数组
1.1 从集合创建数组 into-array
into-array
(into-array aseq)
(into-array type aseq)
演示样例:
user=> (into-array [1 2 3])
#<Integer[] [Ljava.lang.Integer;@4b0ea9ba>
user=> (seq (into-array [1 2 3]))
(1 2 3)
返回包括aset中全部元素的数组。数组的组件类型为type(假设指定了type),或aset中第一个元素的类型(假设aset不为空)。或Object。aset中全部元素的类型必须兼容数组的组件类型。type能够使用基本类型的类对象,比如Integer/TYPE等。
Added in Clojure version 1.0
Source
(into-array aseq)
1 |
(into-array []) ; #<Object[]> - [] |
2 |
(into-array [ 1 2 3 ]) ; #<Long[]> - [ 1 , 2 , 3 ],注:into-array返回的不是原生数组,而是引用数组 |
演示样例:
user=> (into-array [])
#<Object[] [Ljava.lang.Object;@26ae533a>
user=> (into-array Integer/TYPE [1 2 3])
#<int[] [I@2cba5bdb>
user=> (into-array Long/TYPE [1 2 3])
#<long[] [J@373c0b53>
user=> (seq (into-array Long/TYPE [1 2 3]))
(1 2 3)
(into-array type aseq)
1 |
(into-array Integer/TYPE [ 1 2 3 ]) ; #< int []> - [ 1 , 2 , 3 ] |
2 |
; 等效于( int -array [ 1 2 3 ]) |
1.2 创建空数组 make-array
make-array
(make-array type len)
(make-array type dim & more-dims)
创建并返回一个指定类型、指定尺寸的数组。须要注意是类对象是必需的。
类对象能够通过导入或全然限定名称获得。type能够使用基本类型的类对象,比如Integer/TYPE等。
Added in Clojure version 1.0
Source
(make-array type len)
1 |
(make-array Integer/TYPE 10 ) ; #< int []> - [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] |
2 |
; 等效于( int -array 10 ) |
(make-array type dim & more-dims)
1 |
(make-array Integer/TYPE 2 10 ) ;二维数组 #< int [][]> - [[I @4b8bc0fb , [I @442ac57c ] |
2 |
(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
演示样例:
user=> (int-array 10)
#<int[] [I@6490832e>
user=> (seq (int-array 10))
(0 0 0 0 0 0 0 0 0 0)
user=> (double-array 10 1.24)
#<double[] [D@2f87c55c>
user=> (seq (double-array 10 1.24))
(1.24 1.24 1.24 1.24 1.24 1.24 1.24 1.24 1.24 1.24)
同系列的全部方法
- byte-array
- short-array
- int-array
- long-array
- float-array
- double-array
- char-array
- boolean-array
- object-array*
object-array仅仅有(object-array size-or-seq)使用方法
(int-array size)
1 |
( int -array 3 ) ; #< int []> - [ 0 , 0 , 0 ] |
2 |
; 相当于(make-array Integer/TYPE 3 ) |
(int-array seq)
1 |
( int -array [ 1 2 3 ]) ; #< int []> - [ 1 , 2 , 3 ] |
2 |
; 相当于(into-array Integer/TYPE [ 1 2 3 ]) |
(int-array size init-val)
1 |
( int -array 3 5 ) ; #< int []> - [ 5 , 5 , 5 ] |
(int-array size seq)
1 |
( int -array 5 [ 1 2 3 ]) ; #< int []> - [ 1 , 2 , 3 , 0 , 0 ] |
2 |
( int -array 5 [ 1 2 3 4 5 6 7 ]) ; #< int []> - [ 1 , 2 , 3 , 4 , 5 ] |
2、 訪问和改动数组
2.1 訪问数组的值 aget
aget
(aget array idx)
(aget array idx & idxs)
返回指定索引的值。可用于全部类型的Java数组。(等效于array[idx])
Added in Clojure version 1.0
Source
1 |
(let [arrs (into-array |
2 |
[( int -array [ 1 2 3 ]) |
3 |
( int -array [ 11 12 13 14 15 ])])] |
4 |
; #< int [][]> [[ 1 , 2 , 3 ], [ 11 , 12 , 13 , 14 , 15 ]] |
5 |
(println (aget arrs 0 2 )) |
6 |
; 3 |
7 |
(println (aget arrs 1 4 ))) |
8 |
; 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)
1 |
(let [arr (object-array [ "A" "B" "C" "D" "E" ]) |
2 |
; [A, B, C, D, E] |
3 |
val (aset arr 2 "F" )] |
4 |
(println val)) |
5 |
; arr: [A, B, F, D, E] |
6 |
; val: F |
演示样例:
(let [arr (object-array ["A" "B" "C" "D" "E"])
val (aget arr 2)
val2 (aset arr 2 "F")
]
(println val) ; C
(println val2) ; F
)
(aset array idx idx2 & idxv)
01 |
// Java |
02 |
public static Object[][][] arr3d = { |
03 |
{ |
04 |
{ |
05 |
"A" , "B" , "C" , "D" , "E" |
06 |
}, |
07 |
{ |
08 |
"1" , "2" , "3" , "4" , "5" |
09 |
} |
10 |
}, |
11 |
{ |
12 |
{ |
13 |
'a' , 'b' , 'c' , 'd' , 'e' |
14 |
}, |
15 |
{ |
16 |
11 , 12 , 13 , 14 , 15 |
17 |
} |
18 |
} |
19 |
}; // 用Clojure初始化多维数组实在是太蛋疼了 |
20 |
21 |
; clojure |
22 |
(let [val1 (aset arr3d 0 0 0 "val1" ) |
23 |
val2 (aset arr3d 0 1 0 "val2" ) |
24 |
val3 (aset arr3d 1 0 0 "val3" ) |
25 |
val4 (aset arr3d 1 1 0 "val4" )] |
26 |
(println (java.util.Arrays/toString (aget arr3d 0 0 ))) |
27 |
(println (java.util.Arrays/toString (aget arr3d 0 1 ))) |
28 |
(println (java.util.Arrays/toString (aget arr3d 1 0 ))) |
29 |
(println (java.util.Arrays/toString (aget arr3d 1 1 )))) |
30 |
; [val1, B, C, D, E] |
31 |
; [val2, 2 , 3 , 4 , 5 ] |
32 |
; [val3, b, c, d, e] |
33 |
; [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
同系列全部方法
- aset-byte
- aset-short
- aset-int
- aset-long
- aset-float
- aset-double
- aset-char
- aset-boolean
- aset
2.3 计算数组长度 alength
alength
(alength array)
返回Java数组的长度。可用于全部类型的数组。
Added in Clojure version 1.0
Source
1 |
(alength ( char -array 11 \a)) ; 11 |
2 |
; 等效于(count ( char -array 11 \a)) |
2.4 使用Clojure序列库
2.4.1 通用版序列库
1 |
; clojure.lang.LazySeq |
2 |
; 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
1 |
; 为数组的每一个值加 2 |
2 |
(let [arr ( int -array [ 1 2 3 ]) |
3 |
ret (amap arr idx ret ( do |
4 |
(println "=" (vec ret)) |
5 |
(+ 2 (aget ret idx))))] |
6 |
(println (vec ret))) |
演示样例:
(let [arr (int-array [1 2 3])
ret (amap arr idx ret (do (println "=" (vec ret))
(+ 2 (aget ret idx)))
)]
(println (vec ret))
) ;= [1 2 3]
;= [3 2 3]
;= [3 4 3]
;[3 4 5]
areduce 宏
(areduce a idx ret init expr)
用表达式expr归纳数组a。使用一个索引idx。和一个返回值ret。将ret初始化为init,将ret设置为expr表达式每一步的计算结果,最后返回ret。
Added in Clojure version 1.0
Source
1 |
; 计算数组[ 1 , 2 , .., 100 ]每一个元素的和 |
2 |
(let [arr ( int -array (range 1 101 )) |
3 |
ret (areduce arr idx ret 0 (+ ret (aget arr idx)))] |
4 |
(println ret)) |
5 |
; 5050 |
3、 其它
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
4、总结
生活中一怕没有选择。二怕选择过多。创建数组的方法太多也会使思维混乱。一般而言对于引用类型的对象,使用集合容器远优于使用数组。所以使用数组的场景就仅仅有处理基本类型数据(而且对性能有一定要求)的情况了,因此个人推荐优先使用int-array等方法创建数组。
花了一天时间,翻了好几本书。差点儿找遍了与数组相关的全部方法,希望没有遗漏的。
Clojure数组专题到此为止,之后会继续以专题的形式总结其它的API。
========2013/11/4
Clojure操作多维数组的aset, aget性能简直让人无法直视,用来写算法还是算了吧。
========2013/12/8
直接使用into-array函数返回的不是原生数组,而是一个引用数组。假设要用into-array创建原生数组,必须指定类型(第一个參数)。之前没注意这个。在《The Joy Of Clojure》中看到。
附录:
user=> (find-doc "-array")
user=> (find-doc "-array")
-------------------------
clojure.core/boolean-array
([size-or-seq] [size init-val-or-seq])
Creates an array of booleans
-------------------------
clojure.core/byte-array
([size-or-seq] [size init-val-or-seq])
Creates an array of bytes
-------------------------
clojure.core/char-array
([size-or-seq] [size init-val-or-seq])
Creates an array of chars
-------------------------
clojure.core/double-array
([size-or-seq] [size init-val-or-seq])
Creates an array of doubles
-------------------------
clojure.core/float-array
([size-or-seq] [size init-val-or-seq])
Creates an array of floats
-------------------------
clojure.core/int-array
([size-or-seq] [size init-val-or-seq])
Creates an array of ints
-------------------------
clojure.core/into-array
([aseq] [type aseq])
Returns an array with components set to the values in aseq. The array's
component type is type if provided, or the type of the first value in
aseq if present, or Object. All values in aseq must be compatible with
the component type. Class objects for the primitive types can be obtained
using, e.g., Integer/TYPE.
-------------------------
clojure.core/long-array
([size-or-seq] [size init-val-or-seq])
Creates an array of longs
-------------------------
clojure.core/make-array
([type len] [type dim & more-dims])
Creates and returns an array of instances of the specified class of
the specified dimension(s). Note that a class object is required.
Class objects can be obtained by using their imported or
fully-qualified name. Class objects for the primitive types can be
obtained using, e.g., Integer/TYPE.
-------------------------
clojure.core/short-array
([size-or-seq] [size init-val-or-seq])
Creates an array of shorts
-------------------------
clojure.core/to-array
([coll])
Returns an array of Objects containing the contents of coll, which
can be any Collection. Maps to java.util.Collection.toArray().
-------------------------
clojure.core/to-array-2d
([coll])
Returns a (potentially-ragged) 2-dimensional array of Objects
containing the contents of coll, which can be any Collection of any
Collection.
nil
參考推荐:
Clojure 学习入门(19)—— 数组的更多相关文章
- Clojure 学习入门(14)—— 循环控制
Clojure 基于函数的流程控制 repeatedly 字面意思为重复函数.一般的用法如下: #(rand-int 11)) 8 2 6 6) 重复产生5次随机数.rand-int 11表示0至 ...
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- 给深度学习入门者的Python快速教程
给深度学习入门者的Python快速教程 基础篇 numpy和Matplotlib篇 本篇部分代码的下载地址: https://github.com/frombeijingwithlove/dlcv_f ...
- 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV
这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...
- OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(下)
1 UI5代码结构 上一次我们一起用了20秒的时间完成一个UI5版的Hello World.应用打开后有一个按钮,按钮的文字是Hello World,点击这个按钮之后,按钮会慢慢的消失掉(Fade o ...
- [转] Clojure 快速入门指南:1/3
[From] http://huangz.iteye.com/blog/1325228 导读 本文的目标是为熟悉 Ruby.Python或者其他类似语言.并对 Lisp 或者函数式编程有一定程度了解的 ...
- 深度学习入门者的Python快速教程 - 基础篇
5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明 ...
- mnist手写数字识别——深度学习入门项目(tensorflow+keras+Sequential模型)
前言 今天记录一下深度学习的另外一个入门项目——<mnist数据集手写数字识别>,这是一个入门必备的学习案例,主要使用了tensorflow下的keras网络结构的Sequential模型 ...
- 每天成长一点---WEB前端学习入门笔记
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
随机推荐
- boost库的安装,使用,介绍,库分类
1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...
- Unix/Linux环境C编程入门教程(24) MySQL 5.7.4 for Red Hat Enterprise 7(RHEL7)的安装
远观历史, MySQL的主要目的是为了能够在单处理器核心的商业服务器上运行.如今MySQL的一个变化用户可能不会注意到,那就是甲骨文已经开始重新架构MySQL的代码,使它大量的模块化.如软件解析器,优 ...
- 让C/C++程序一次编译可以发布到多版本Linux之上
最近页游开放平台比较多, 每个平台要求的Linux版本各不相同, 这给开发人员部署服务器带来了很大的困难. 在本机Linux编译的程序,发布时即便将依赖的so附带到目标Linux环境,仍然会碰到依赖及 ...
- linux之SQL语句简明教程---TRIM
SQL 中的 TRIM 函数是用来移除掉一个字串中的字头或字尾.最常见的用途是移除字首或字尾的空白.这个函数在不同的资料库中有不同的名称: MySQL: TRIM( ), RTRIM( ), LTRI ...
- satellite-menu和ArcMenu
github上的开源库其实还是很不错的,之前的时候总感觉学一些开源库比较麻烦,里边有好多方法什么的,今天终于迈出了第一步,中间也遇到了一些问题,现在总结下,也给其他刚开始学习开源库的小伙伴一些指导: ...
- SQL————高级查询
高级查询 --连接查询 select * from 表1,表2 ————形成笛卡尔积 select * from 表1,表2 where 表1.主键=表2.外键 ————主外键位置可以互换 --jo ...
- UIButton, KVC, KVO
按钮 自定义按钮:调整内部子控件的frame 方式1:实现titleRectForContentRect:和imageRectForContentRect:方法,分别返回titleLabel和imag ...
- JavaScript function函数种类(转)
转自:http://www.cnblogs.com/polk6/p/3284839.html JavaScript function函数种类 本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通 ...
- 整理mysql的一些常用用法
在php项目中,使用mysql的一些常用的语句,今天有空系统整体一下.有些整理自网络,如有错误,请指正,谢谢.... #显示数据库和显示数据表show databases;use databaseNa ...
- JFrame??
swing的三个基本构造块:标签.按钮.文本字段.但需要个地方安放他们,并希望用户如何处理他们.JFrame类就是解决这个问题————它是一个容器,允许程序员把其他组件添加到它里面,把它们组织起来,并 ...