Groovy之數據結構
- 2019 年 12 月 26 日
- 筆記

列表list
定義
Java中定義方式:def list = ArrayList()//java 中定義列表方式
Groovy中定義方式:def list = [1, 2, 3, 4, 5]//groovy 中定義列表方式
增加
- 直接通過add的方式添加元素,與Java一直
- 使用Groovy特有的語法leftShift進行添加,例如:
listMake.leftShift(9)
- 使用
<<
進行添加元素,例如:listMake << 8
def listMake = [1, 2, 3, 4] /** * list 添加元素 */ //listMake.add(10) //listMake.leftShift(9) listMake << 8 println listMake
刪除
- 通過與Java一樣的方法remove與removeAt方法
- 可以自定義閉包對集合中的元素特殊處理進行移除操作
- 可以通過
-
符號進行刪除集合中存在的元素,有就刪除,沒有不刪除
/** * list 刪除元素 */ //listMake.remove(0) //listMake.removeAt(1) //listMake.removeElement(2) //自定義閉包方式移除集合中所有的奇數 listMake.removeAll { return (it & 1) == 1 } //減去當前集合中存在的元素,有就移除,沒有不移除 println listMake - [2, 4]
查找
find
查找集合中第一個滿足條件的元素,並返回查找元素findAll
查找集合中所有滿足條件的元素,返回的是一個集合any
返回的是Boolean,集合中有一個元素滿足條件,就返回true,否則falseevery
與any一樣返回的是Boolean,不同的是集合中所有的元素都需要滿足該條件才返回true,如果有一個沒有滿足就返回false
* 列表查找 */ def findList = [2, 4, 3, 5, 7, -100] //查找第一個滿足是奇數條件的數 int result = findList.find { return (it & 1) == 1 } println result def resultLsit = findList.findAll { return (it & 1) == 0 } println resultLsit.toListString() def anyResult = findList.any { return (it & 1) == 1 } println anyResult def everyResult = findList.every { return (it & 1) == 1 } println everyResult println findList.min() //獲取絕對值的最大值 println findList.max { Math.abs(it) }
排序
列表排序可以自定義閉包的方式進行排序,例如:Comparator mc = { a, b -> a == b ? 0 : Math.abs(a) < Math.abs(b) ? -1 : 1 }
或者直接調用sort方法進行排序,也可以在sort方法進行自定義閉包形式排序
/** * 列表排序 */ def sortList = [-4, -10, 23, 4, 11, 9] //自定義排序方式,按照絕對值進行排序 Comparator mc = { a, b -> a == b ? 0 : Math.abs(a) < Math.abs(b) ? -1 : 1 } //Collections.sort(sortList,mc) //sortList.sort() //按照絕對值從大到小進行排序 sortList.sort { a, b -> a == b ? 0 : Math.abs(a) < Math.abs(b) ? 1 : -1 } println sortList
其他操作
def array = [2, 3, 4, 5] as int[]//將列錶轉換成數組形式 int[] array2 = [1, 2, 3, 4] println findList.min() //獲取絕對值的最大值 println findList.max { Math.abs(it) } //統計個數 def count = findList.count { return (it & 1) == 1 } println count
Map
值得注意的是:groovy
中定義map,默認都是LinkedHashMap
。但可以通過as HashMap
轉換成HashMap,或者一開始就定義HashMap,否則默認都是LinkedHashMap
添加
- 通過
color.complex = [a: 1, b: 2]
- 通過
leftShirt
進行添加,例如:color.leftShift("ss": "222")
def color = ["red" : "ff0000", "green": "00ff00", "black": "000000"] //索引方式 println color['red'] println color.green //添加元素,查找元素,沒有則添加 color.yello = "fff000" //添加新的map color.complex = [a: 1, b: 2] //添加一個元素 color.leftShift("ss": "222") println color.toMapString() //只能通過getClass 來獲取類型,否則color.class 就是查找當前中是否有key為class內容,沒有則返回null println color.getClass()
遍歷
- 通過
each
進行遍歷 - 通過
eachWithIndex
進行索引遍歷 - 通過
key與value
進行遍歷
def student = [ 1: [number: 001, score: 45, age: 23, name: "ztz"], 2: [number: 002, score: 56, age: 25, name: "yif"], 3: [number: 003, score: 67, age: 26, name: "fxy"], 4: [number: 004, score: 78, age: 28, name: "cxm"], ] //遍歷 student.each { def stu -> println "the key is ${stu.key},and the value is ${stu.value}" } /** * 索引遍歷 注意:student與index不能顛倒順序,否則輸出報錯,因為會首先迭代獲取當前map中內容 */ student.eachWithIndex { def stu, int index -> println "the index is ${index}," + "the key is ${stu.value}" + " the value is ${stu.value}" } //直接遍歷 key與value student.each { key, value -> println "the key is $key," + "the value is $value" } student.eachWithIndex { key, value, index -> println "the index is $index," + "the key is $key," + "the value is $value" }
查找
find
中閉包處理,內部通過get來通過key獲取value值,返回第一個符合條件的對象findAll
中閉包處理,內部通過get來通過key獲取value值,返回所有符合條件的對象
/** * map 查找 */ def student = [ 1: [number: 001, score: 45, age: 24, name: "ztz"], 2: [number: 002, score: 56, age: 25, name: "yif"], 3: [number: 003, score: 67, age: 26, name: "fxy"], 4: [number: 004, score: 78, age: 26, name: "cxm"], ] def entry = student.find { def students -> //必須通過get來獲取key值 return students.value.get("score") >= 60 } def entrys = student.findAll { def stu -> return stu.value.get("score") >= 60 } println entry println entrys def counts = student.count { def stu -> return stu.value.get("score") >= 60 && stu.value.get("age") == 26 } println counts def names = student.findAll { def stu -> return stu.value.get("score") >= 60 }.collect { //使用collect進行過濾,只輸出名字 return it.value.get("name") } println names.toListString() //groupBy 進行分組輸出 def groupResult = student.groupBy { def stu -> return stu.value.get("score") >= 60 ? "及格" : "不及格" } println groupResult.toMapString()
排序
與列表排序類似,通過閉包進行自定義排序方式
/* map 排序 */ def sortResult = student.sort { def stu1, def stu2 -> Number sore1 = stu1.value.get("score") Number sore2 = stu2.value.get("score") return sore1 == sore2 ? 0 : sore1 > sore2 ? 1 : -1 } println sortResult.toMapString()
Range
Range 返回處理,可以進行each返回輸出,或者在switch中定義範圍進行處理
/* 範圍 */ def range = 1..10 println range[0] println range.contains(10) //獲取範圍起始值 println range.from println range.to range.each { print it + " " } def getGrade(Number number) { def result = 0 switch (number) { case 0..<60: result = "不及格" break case 60..<70: result = "及格" break case 70..<80: result = "良好" break case 80..<100: result = "優秀" break } //return 可以省略 return result } println getGrade(90)