Groovy中的列表映射范围数据类型的相关操作

文章目录

        • [1 列表](#1 列表)
          • [1.1 列表的定义](#1.1 列表的定义)
          • [1.2 添加和删除元素](#1.2 添加和删除元素)
          • [1.3 列表中元素排序](#1.3 列表中元素排序)
          • [1.4 列表中查找元素](#1.4 列表中查找元素)
        • [2 映射](#2 映射)
          • [2.1 映射的定义](#2.1 映射的定义)
          • [2.2 映射的遍历](#2.2 映射的遍历)
          • [2.3 映射的查找和排序](#2.3 映射的查找和排序)
        • [3 范围](#3 范围)
1 列表
1.1 列表的定义

​ 可以通过下面两种方式定义列表:一直是方式和在java中一样,一种是groovy的语法自带的。

groovy 复制代码
package com.dream21th

//定义集合方式一,参照java的方式定义
def list=new ArrayList()

//定义集合的方式二,采用groovy的方式定义
def list2=[1, 2, 3, 4, 5]
println(list2.class)//class java.util.ArrayList
println(list2.size())//5

//定义数组
def arr=[1,2,3,4] as int[]
int[] arr2=[1,2,3,4]
println(arr.class)//class [I
println(arr2.class)//class [I
1.2 添加和删除元素

​ 向列表中添加元素有下面几种方式:

groovy 复制代码
//列表增加元素操作
def list= [1,2,3,4,5,6,7]

//列表添加元素的方式一
list.add(8)
println(list) //[1, 2, 3, 4, 5, 6, 7, 8]

//列表添加元素的方式二
list.leftShift(9)
println(list)

//列表添加元素的方式三
list << 10
println(list)

//列表添加元素的方式四(这里会生成一个新的列表)
def newList = list + 11
println(newList)

​ 从列表中删除元素的方式有:

groovy 复制代码
//列表删除元素操作
def list2= [1,2,3,4,5,6,7]

//根据索引删除元素(例子是删除索引为4的元素)
list2.remove(4)
println(list2)//[1, 2, 3, 4, 6, 7]

//按照指定元素删除,由于此数组是数字类型,所以需要转换不然会按照索引删除
list2.remove((Object)3)
println(list2)//[1, 2, 4, 6, 7]

//删除元素值为2的值
list2.removeElement(2)
println(list2)//[1, 4, 6, 7]

//删除所有偶数的值
def list3= [1,2,3,4,5,6,7]
list3.removeAll(it->it%2==0)
println(list3)//[1, 3, 5, 7]

//使用操作符删除元素
def list4= [1,2,3,4,5,6,7]
def newList4= list4 - [5,7,8]
println(newList4)//[1, 2, 3, 4, 6]
1.3 列表中元素排序

​ 列表元素的排序有下面几种:

groovy 复制代码
package com.dream21th

def list= [3,7,5,-2,9,0]

//升序操作
list.sort()
println(list) //[-2, 0, 3, 5, 7, 9]

//数组排序反转
list.reverse(true)
println(list)//[9, 7, 5, 3, 0, -2]

//按照绝对值大小排序,闭包
def list2= [3,7,5,-2,9,0]
list2.sort{num1,num2 -> Math.abs(num1)>=Math.abs(num2)?1:-1}
println(list2)//[0, -2, 3, 5, 7, 9]

//按照绝对值大小排序
def list3= [3,7,5,-2,9,0]
list3.sort(Comparator.comparing(it->Math.abs(it)))
println(list3)//[0, -2, 3, 5, 7, 9]
1.4 列表中查找元素

​ 列表中查找元素有下面的方法:

groovy 复制代码
package com.dream21th

def list= [3,7,5,-2,9,0]

//查找列表中第一个偶数
println(list.find {it%2==0})//-2
//查找列表中所有偶数
println(list.findAll {it%2==0})//[-2, 0]

//列表中只要有一个元素是偶数就返回true
println(list.any {it%2==0})//true

//列表中每一个元素都是偶数就返回true
println(list.every {it%2==0})//false

//获取列表中最大元素
println(list.max())//9
//获取列表中最小元素
println(list.min())//-2

//统计偶数的个数
println(list.count {it%2==0})//2
2 映射
2.1 映射的定义

​ 可以参照下面方式定义映射,并做一些操作:

groovy 复制代码
package com.dream21th

def map1=[
        "name":"张三",
        "age": 18,
        "phone":"13777771234"
]

println(map1) //[name:张三, age:18, phone:13777771234]

map1.'address' = "上海市浦东新区"
println(map1)//[name:张三, age:18, phone:13777771234, address:上海市浦东新区]

map1["hobby"]=["跑步","游泳"]
println(map1)//[name:张三, age:18, phone:13777771234, address:上海市浦东新区, hobby:[跑步, 游泳]]

map1.'scores'=[
        "语文":99,
        "数学":100
]
println(map1)//[name:张三, age:18, phone:13777771234, address:上海市浦东新区, hobby:[跑步, 游泳], scores:[语文:99, 数学:100]]

//定义map默认采用的是java.util.LinkedHashMap
println(map1.getClass())//class java.util.LinkedHashMap

//可以通过下面方法指定map
def map2=[
        "name":"张三",
        "age": 18,
        "phone":"13777771234"
] as Hashtable
println(map2.getClass())//class java.util.Hashtable
2.2 映射的遍历

​ 可以按照下面方式遍历映射:

groovy 复制代码
package com.dream21th


def map1=[
        "name":"张三",
        "age": 18,
        "phone":"13777771234"
]

//遍历方式一
map1.each {it -> println(it.key+"   "+it.value)}
//name   张三
//age   18
//phone   13777771234

//遍历方式二
map1.each {key,value -> println(key+"   "+value)}
//name   张三
//age   18
//phone   13777771234

//带索引遍历
map1.eachWithIndex{ Map.Entry<String, Serializable> entry, int i -> printf("index:%d,key:%s,value:%s\n",i,entry.key,entry.value)}
//index:0,key:name,value:张三
//index:1,key:age,value:18
//index:2,key:phone,value:13777771234


map1.eachWithIndex{ key,value, int i ->printf("index:%d,key:%s,value:%s\n",i,key,value) }
//index:0,key:name,value:张三
//index:1,key:age,value:18
//index:2,key:phone,value:13777771234
2.3 映射的查找和排序

​ 可以按照下面的代码对映射中的值进行查找和排序:

groovy 复制代码
package com.dream21th

def map1=[
        "stu1":new People(name: "张三",age:18,phone: "139711111234"),
        "stu2":new People(name: "里斯",age:19,phone: "141711111234"),
        "stu3":new People(name: "王五",age:16,phone: "151711111234"),
        "stu4":new People(name: "赵六",age:20,phone: "134711111234"),
]

class People{
    //姓名
    String name
    //年龄
    int age
    //电话
    String phone

    @Override
    String toString() {
        return "{name:"+name+",age:"+age+",phone:"+phone+"}"
    }
}

//找到map中第一个年龄等于18的
println(map1.find{it -> it.value.age==18})//stu1={name:张三,age:18,phone:139711111234}

//找到map中年龄大于等于18的所有值
println(map1.findAll{it -> it.value.age>=18})//[stu1:{name:张三,age:18,phone:139711111234}, stu2:{name:里斯,age:19,phone:141711111234}, stu4:{name:赵六,age:20,phone:134711111234}]

//找到map中年龄大于等于18的所有值的key
println(map1.findAll{it -> it.value.age>=18}.collect {it -> it.key}) //[stu1, stu2, stu4]

//分组
println(map1.groupBy{it -> it.value.age>=18?"成年":"未成年"})//[成年:[stu1:{name:张三,age:18,phone:139711111234}, stu2:{name:里斯,age:19,phone:141711111234}, stu4:{name:赵六,age:20,phone:134711111234}], 未成年:[stu3:{name:王五,age:16,phone:151711111234}]]

//排序
def map2 = map1.sort {stu1,stu2 -> stu1.value.age >= stu2.value.age ?1:-1}
println(map2)//[stu3:{name:王五,age:16,phone:151711111234}, stu1:{name:张三,age:18,phone:139711111234}, stu2:{name:里斯,age:19,phone:141711111234}, stu4:{name:赵六,age:20,phone:134711111234}]
3 范围

​ 范围是在groovy中的定义方式和使用如下:

groovy 复制代码
package com.dream21th

//2到9的闭区间
def r=2..9
println(r)//2..9
println(r.size())//8

//9不包含
def r1=2..<9
println(r1)//2..<9
println(r1.size())//7

//索引为0的元素
println(r1[0])//2
//范围是否包含5
println(r1.contains(5))//true
//范围的起始值
println(r1.from)//2
//范围的终止值
println(r1.to)//8

//遍历打印
r1.each {it -> println(it)}

//遍历打印
for(e in r1){
    println(e)
}
相关推荐
念九_ysl3 分钟前
Java 使用 OpenHTMLToPDF + Batik 将含 SVG 遮罩的 HTML 转为 PDF 的完整实践
java·开发语言·pdf
yaoxin52112313 分钟前
124. Java 泛型 - 有界类型参数
java·开发语言
liulilittle33 分钟前
深度剖析:OPENPPP2 libtcpip 实现原理与架构设计
开发语言·网络·c++·tcp/ip·智能路由器·tcp·通信
88号技师39 分钟前
2025年6月一区-田忌赛马优化算法Tianji’s horse racing optimization-附Matlab免费代码
开发语言·算法·matlab·优化算法
Tipriest_40 分钟前
Python关键字梳理
python·关键字·keyword
勤奋的知更鸟1 小时前
Java 编程之模板方法模式
java·开发语言·模板方法模式
上单带刀不带妹2 小时前
手写 Vue 中虚拟 DOM 到真实 DOM 的完整过程
开发语言·前端·javascript·vue.js·前端框架
im_AMBER2 小时前
学习日志05 python
python·学习
大虫小呓2 小时前
Python 处理 Excel 数据 pandas 和 openpyxl 哪家强?
python·pandas
哪 吒2 小时前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷