美文网首页
Groovy<第六篇>:基础语法(5)---集合

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

作者: NoBugException | 来源:发表于2020-05-10 09:31 被阅读0次

    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中存放了键值对。

    [本章完...]

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/pxolnhtx.html