结合的创建-List
首先.一下试试
三种List 查一查 关于这三种的说明
其实都没啥不一样 貌似是用 mutable 比较好
在 Kotlin 中,List
的默认实现是 ArrayList,可以将其视为可调整大小的数组。 这个是官网的原话...
貌似是 mutable 更 功能一些 更兼容
同理map 也是
增加:
//包含100
val toMutableList = (0..100).toMutableList()
println(toMutableList)
增强循环-foreach
首先先统计一下遍历的方式
一.
// a 代表元素
for (a in list){
println(a)
}
二.
// 很low
for (i in 0..list.size-1) {
println(list[i])
}
二 升级
for (index in list.indices) {
println(list[index])
}
三.
it指代元素
list.forEach {
println(it)
}
集合过滤器-filter
首先是fliter
联想到Intent-filter 可以在你需要这个功能的地方.一下fliter 试试
筛选所有 首字节是"a"的
val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
.filter { it.startsWith("a") }
.forEach { println(it) }
2019-10-22 10:45:48.104 14586-14586/com.as.app2 I/System.out: avocado
2019-10-22 10:45:48.104 14586-14586/com.as.app2 I/System.out: apple
然后是排序
val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.forEach { println(it) }
2019-10-22 10:49:33.226 23859-23859/? I/System.out: apple
2019-10-22 10:49:33.226 23859-23859/? I/System.out: avocado
可以看到第二字母也排序了
同样类似于Java Collections.sort
list.sort 1 2 3 4 | a b c d 先按第一个字节进行排序的
sort : 默认是按照字母的 abcd 1 2 3 4 排序的 升序
sorDescending :降序
sortBy: 加入排序条件
numbers.sortBy { it.length } 按照字符串长度进行排序
sortwith:将对象按照一定规则排序 这个很简单
val numbers = mutableListOf("one" to 1, "two" to 3, "three" to 4, "four" to 2)
numbers.sortWith(compareBy({ it.first }, { it.second }))
println(numbers)
2019-10-23 09:57:31.820 22399-22399/com.as.app2 I/System.out: [(four, 2), (one, 1), (three, 4), (two, 3)]
sortedwith:这个方法尤其注意不能弄混了 因为这个是返回一个新的集合
字母全部大写
val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }
2019-10-22 13:15:48.071 29739-29739/? I/System.out: APPLE
2019-10-22 13:15:48.072 29739-29739/? I/System.out: AVOCADO
集合添加元素
java里边直接添加元素的是add addAll
kotlin 也有这些 相对来说 比较秀
val fruits = mutableListOf("banana", "avocado", "apple", "kiwifruit")
fruits+="我是添加的元素"
fruits+= listOf("哈哈","呵呵","嘿嘿")
println(fruits)
可以直接使用+= 来添加元素 ,如果添加的是一个集合 也可以
2019-10-22 13:48:22.938 8232-8232/com.as.app2 I/System.out: [banana, avocado, apple, kiwifruit, 我是添加的元素, 哈哈, 呵呵, 嘿嘿]
集合移除元素
和java一样Remove(元素) RemoveAt(下标) clear移除所有
相对来说kotlin 确实在这些方面比较方便
如果你要一个一个的 移除某些元素
你可以removeAll( listof()
val fruits = mutableListOf("banana", "avocado", "apple", "kiwifruit")
fruits+="我是添加的元素"
fruits+= listOf("哈哈","呵呵","嘿嘿")
fruits.removeAll (listOf("banana","apple") )
println(fruits)
同样的
fruits-=listOf("banana","apple")
另外,kotlin有一个新的方法
只保留
fruits.retainAll(listOf("banana","apple"))
2019-10-22 14:03:46.256 14622-14622/? I/System.out: [banana, apple]
集合按索引获取数据
list.get[ 0 ]
list[ 0 ]
数组和集合 通了呗
安全获取
getOrNullgetOrElse
val fruits = mutableListOf("banana", "avocado", "apple", "kiwifruit")
println(fruits.getOrNull(4))
2019-10-22 14:16:01.124 12715-12715/? I/System.out: null
这个运行木有报错
没有找到下标的话使用默认
val fruits = mutableListOf("banana", "avocado", "apple", "kiwifruit")
println(fruits.getOrElse(6,{"banana"}))
2019-10-22 14:18:47.715 19117-19117/com.as.app2 I/System.out: banana
截取一段
val numbers = mutableListOf("a0", "b1", "c2", "d3","e4","f5","g6")
//取下标3 4 5
println(numbers.subList(3, 6))//不包含
2019-10-22 14:41:32.883 13739-13739/com.as.app2 I/System.out: [d3, e4, f5]
获取元素位置
indexof 和 lastindexof
val numbers = mutableListOf("a0", "b1", "c2", "d3", "e4", "f5", "g6")
//没有找到元素的话不报错 返回-1
println(numbers.indexOf("b6"))
//indexof和lastindexof区别在于有相同字符串的话会找相同字符串的最后一位
println(numbers.lastIndexOf("b1"))
2019-10-22 14:45:34.037 23526-23526/com.as.app2 I/System.out: -1
2019-10-22 14:45:34.037 23526-23526/com.as.app2 I/System.out: 1
indexOf() : 查找某一个元素或字符串在原字符串中第一次出现的下标。
indexLastOf() : 查找某一个元素或字符串在原字符串中最后一次出现的下标。
indexOfFirst{} : 同indexOf()
indexOfLast{} : 同indexLastOf()
所以换一个样式
//没有找到元素的话不报错 返回-1
println(numbers.indexOfFirst { it == "b6" })
println(numbers.indexOfLast { it == "b1" })
打印出来是一样的
二分查找
kotlin 一个封装好的 搜索方法-> BinarySearch()
如果没有找到这个元素 就返回 -1
如果找到了 就会返回 下标
val numbers = mutableListOf("a0", "b1", "d2", "e3", "e4", "f5", "a6")
println(numbers.binarySearch("e3"))
2019-10-22 15:08:03.524 17131-17131/? I/System.out: 3
自定义数据进查找
class Product(var name: String, var price: Double)
val productList = listOf(
Product("WebStorm", 49.0),
Product("AppCode", 99.0),
Product("DotTrace", 129.0),
Product("ReSharper", 149.0))
println(productList.binarySearch(Product("AppCode", 99.0), compareBy<Product> { it.price }.thenBy { it.name }))
这个是中文官网给的例子 ,确实是返回数据的下标 但是如果你的 数据不是唯一 ,名字有重的 或者价格有重的 你可以试着吧 thenBy 去掉
thenBy 类似于 && 的意思
官网例子
val list = listOf("aa", "b", "bb", "a")
val lengthComparator = compareBy<String> { it.length }
println(list.sortedWith(lengthComparator)) // [b, a, aa, bb]
val lengthThenString = lengthComparator.thenBy { it }
println(list.sortedWith(lengthThenString)) // [a, b, aa, bb]
替换所有集合元素
val numbers = mutableListOf("one" , "two" , "three", "four")
numbers.fill("a")
println(numbers)
2019-10-23 10:01:57.627 15736-15736/com.as.app2 I/System.out: [a, a, a, a]
那么替换单个元素
val numbers = mutableListOf("one" , "two" , "three", "four")
numbers[2]="xxx"
println(numbers)
2019-10-23 10:03:53.277 26876-26876/com.as.app2 I/System.out: [one, two, xxx, four]
随机打乱元素
shuffle
val numbers = mutableListOf("one" , "two" , "three", "four")
numbers.shuffle()
println(numbers)
倒过来
reverse
需要主要Koltin 一个 方法的返回值 方面 Unit
有返回的 都得用返回的新对象才有变化的 早早踩坑
遍历方式:
val lists = mutableListOf<String>()
lists.add("index0")
lists.add("index1")
lists.add("index2")
lists.add("index3")
for ((index, value) in lists.withIndex()) {
println( "$index" +value)
}