结合的创建-List

首先.一下试试

android kotlin list 内容倒过来 kotlin mutablelist_android

三种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

android kotlin list 内容倒过来 kotlin mutablelist_System_02

有返回的 都得用返回的新对象才有变化的 早早踩坑

遍历方式:

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)
        }