Groovy<第六篇>:基础语法(5)---集合

Groovy常见的集合由四种,分别是ListSetMapQueue,本章节只介绍常用的两种集合ListMap

(1)List集合

假设定义一个这样的数组

    def numList = [9,1,2,7,3,4,8,5,6]

[打印整个数组]

    println numList                     //打印整个数组

输出结果为:

[9, 1, 2, 7, 3, 4, 8, 5, 6]

[数组的对象类型]

    println numList.getClass().name     //打印数组类型

输出结果为:

java.util.ArrayList

[数组的长度]

    println numList.size()              //打印数组的长度

输出结果为:

9

[根据数组的索引快速访问元素]

数组的角标是从0开始的,如图:

图片.png

所以,可以将数组下标当成索引来访问元素

    println numList[0]                  //打印第一个元素
    println numList[1]                  //打印第二个元素

有关数组的下标,Groovy是支持负数下标的,如下图:

图片.png

负数下标是从-1开始的,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推。

    println numList[-1]                  //打印倒数第一个元素
    println numList[-2]                  //打印倒数第二个元素

Groovy还支持一次性指定多个下标,下标之间用逗号隔开

    println numList[-3, -1]              //打印倒数第三个元素和倒数第一个元素
    println numList[2, 4]                //打印第三个元素和第五个元素

还可以用..指定一个下标范围,如下:

    println numList[2..4]                //打印第三个元素到第五个元素  

[遍历数组]

Groovy使用each来遍历数组,代码如下:

    numList.each {
        println it
    }

it变量是正在遍历的元素。

这里有闭包的概念,会在后面的章节讲解,此章节不会解释。

[添加元素]

    def numList = [9,1,2,7,3,4,8,5,6]

    numList.add(10)

    println numList

add方法默认在数组结尾添加一个元素。

当然也可以在指定位置插入一个元素

   numList.add(1, 10)

[检查数组中是否含有指定元素]

    def numList = [9,1,2,7,3,4,8,5,6]

    println numList.contains(19)

打印结果为false,因为数组中根本就没有19这个元素。

[获取指定位置元素]

    def numList = [9,1,2,7,3,4,8,5,6]

    println numList.get(1)

get方法传递的数字是数组的下标,从0开始的下标,不能是负数。

[判断数组是否为空]

    def numList = [9,1,2,7,3,4,8,5,6]

    println numList.isEmpty()

[根据原数组生成一个新的数组]

    def numList = [9,1,2,7,3,4,8,5,6]
    def deleteList = [1,3,5]
    def newNumList = numList.minus(deleteList)
    println newNumList

打印结果如下:

[9, 2, 7, 4, 8, 6]

minus方法可以删除数组的一些元素,并生成另一个数组,minus传递的参数是将要删除的数组,如果不想删除任何元素,那么可以传空数组

    def deleteList = []

我们可以添加一些元素并生成一个新的数组,plus方法可以实现,代码如下:

    def numList = [9,1,2,7,3,4,8,5,6]
    def addList = [10,11,12]
    def newNumList = numList.plus(addList)
    println newNumList

打印结果如下:

[9, 1, 2, 7, 3, 4, 8, 5, 6, 10, 11, 12]

plus还可以在指定位置插入元素,如下代码

    def newNumList = numList.plus(1, addList)

[出栈]

数组有一个pop这个方法,意思是弹出第一个数据,代码如下:

    def numList = [9,1,2,7,3,4,8,5,6]
    println numList.pop()

打印结果是:9

[删除指定元素]

remove方法可以删除数组中的指定元素。

可以根据索引删除:(索引不能为负数)

    def numList = [9,1,2,7,3,4,8,5,6]
    numList.remove(3)
    println numList

也可以删除一组数据:

    def numList = [9,1,2,7,3,4,8,5,6]
    numList.removeAll([1,2,3])
    println numList

打印结果如下:

[9, 7, 4, 8, 5, 6]

[数组元素的反转]

reverse可以将数组的元素反转。

    def numList = [9,1,2,7,3,4,8,5,6]
    println numList.reverse()

打印结构如下:

[6, 5, 8, 4, 3, 7, 2, 1, 9]

[排序]

    def numList = [9,1,2,7,3,4,8,5,6]
    println numList.sort()

打印结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

sort()方法默认将数组正序排序。

如果想要降序排序也比较简单,代码如下:

    def numList = [9,1,2,7,3,4,8,5,6]
    println numList.sort().reverse()

反转一下即可。

当然,还有一种办法,就是使用比对器:Comparator

如果不指定Comparator,那么底层默认使用这个比对器NumberAwareComparator,源码如下:

public class NumberAwareComparator<T> implements Comparator<T>, Serializable {
    private static final long serialVersionUID = 9017657289076651660L;

    public NumberAwareComparator() {
    }

    public int compare(T o1, T o2) {
        try {
            return DefaultTypeTransformation.compareTo(o1, o2);
        } catch (IllegalArgumentException | GroovyRuntimeException | ClassCastException var5) {
            int x1 = o1.hashCode();
            int x2 = o2.hashCode();
            if (x1 == x2 && o1.equals(o2)) {
                return 0;
            } else {
                return x1 > x2 ? 1 : -1;
            }
        }
    }
}

我们将这段代码拿出来,并将

                return x1 > x2 ? 1 : -1;

改成

                return x1 > x2 ? -1 : 1;

那么,使用比较器的代码如下:

    def numList = [9,1,2,7,3,4,8,5,6]
    numList.sort(new NumberAwareNewComparator())
    println numList

输出结果依然是倒叙的

[9, 8, 7, 6, 5, 4, 3, 2, 1]
(2)Map集合

Map的用法和List比较类似,只不过它的值时一个键值对(K:V)的形式。

定义一个Map集合

    def map = ["name":"张三", "age":43]

[打印map集合]

    println map

打印结果如下:

[name:张三, age:43]

[获取map集合的对象类型]

    println map.getClass().name

打印结果如下:

java.util.LinkedHashMap

我们发现,其对象其实就是LinkedHashMap对象。

[map集合的长度]

    println map.size()

打印结果如下:

2

[根据键(key)快速访问元素]

    println map["name"]                  //打印key=name对应的元素
    println map["age"]                  //打印key=age对应的元素

打印结果如下:

张三
43

[如何判断map集合中是否含有此键(key)]

    println map.containsKey("name")

打印结果如下:

true

[直接获取对应键(key)对应的值]

    println map.get("name")

打印结果如下:

张三

如果在map集合中找不到指定的键,那么打印结果就是:null

[获取一组键]

    println map.keySet()

打印结果如下:

[name, age]

[获取一组值]

    println map.values()

打印结果如下:

[张三, 43]

[在map集合中添加元素]

    def map = ["name":"张三", "age":43]
    map.put("birthday", "2019/5/9")
    println map

打印结果如下:

[name:张三, age:43, birthday:2019/5/9]

但是,map集合中的key是不能重复的,如果使用这个方法添加一个已有key的键值对会怎样呢?

代码如下:

    def map = ["name":"张三", "age":43]
    map.put("name", "李四")
    println map

打印结果如下:

[name:李四, age:43]

从打印结果上看,map集合中并没有添加一个新的键值对,而是覆盖了name键对应的值。

[遍历map集合]

Groovy语言中,遍历List使用each()方法,而遍历map集合也是使用each(),代码如下:

    def map = ["name":"张三", "age":43]
    map.each {
        println it.key+":"+it.value
    }

打印结果如下:

name:张三
age:43

it是正在遍历的元素,Map集合的元素是Map.EntryMap.Entry中存放了键值对。

[本章完...]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359