List/Set/Map等集合学习笔记###
/**
* DESC : List/Set/Map等集合
*/
class KtBaseCollectionTest02 {
companion object{
const val TAG = "KtBaseCollectionTest02"
}
/**
* 不可变集合set
* set: 无重复元素
*/
fun testSet01() {
val set = setOf<String>("mcm", "mlb", "mk")
//testSet01==>element0=mcm, element1=mlb, element2=mk
Log.d(TAG, "testSet01==>element0="+set.elementAt(0)
+", element1="+set.elementAt(1)
+", element2="+set.elementAt(2))
//下面会出下标越界异常
//Caused by: java.lang.IndexOutOfBoundsException: Collection doesn't contain element at index 5.
// Log.d(TAG, "testSet01==>element5="+set.elementAt(5))
//TODO TIP : 使用set集合,尽量使用elementAtOrElse和elementAtOrNull来避免崩溃
//testSet01==>element0=mcm, element5=下标越界,品牌不存在
Log.d(TAG, "testSet01==>element0="+set.elementAtOrElse(0) {"下标越界,品牌不存在"}
+", element5="+set.elementAtOrElse(5) {"下标越界,品牌不存在"})
//testSet01==>element0=mcm, element5=下标越界,品牌不存在
Log.d(TAG, "testSet01==>element0="+set.elementAtOrNull(0)
+", element5="+(set.elementAtOrNull(5) ?: "下标越界,品牌不存在"))
}
/**
* 可变集合set,用法见list
*/
fun testSet02() {
val set = mutableSetOf<String>("mcm", "mlb", "mk")
set += "mj"
set += "mk"//集合中已经mk,再次加mk,会去重操作
set -= "mcm"
set.add("lv")
set.remove("mlb")
//testSet02==>set=[mk, mj, lv]
Log.d(TAG, "testSet02==>set="+set)
}
fun testSet03() {
//可变list(集合中具有重复元素"mcm")
val list= mutableListOf("mcm", "mlb", "mk", "mcm")
//第一种:list转成set,去重复元素
val set = list.toSet()
//testSet03==>list=[mcm, mlb, mk, mcm]
Log.d(TAG, "testSet03==>list="+list)
//testSet03==>set=[mcm, mlb, mk]
Log.d(TAG, "testSet03==>set="+set)
//第二种: list 转 set 再转回 list, 也能去重复元素
val list2 = list.toSet().toList()
//testSet03==>list2=[mcm, mlb, mk]
Log.d(TAG, "testSet03==>list2="+list2)
// 第三种: 快捷函数distinct去重
/**
* distinct函数内部实现,其实就是调用toMutableSet().toList()
* public fun <T> Iterable<T>.distinct(): List<T> {
return this.toMutableSet().toList()
}
*/
val list3 = list.distinct()
//testSet03==>list3=[mcm, mlb, mk]
Log.d(TAG, "testSet03==>list3="+list3)
/**
* list.toMutableSet().toList()实现方式于list.distinct()等价
*/
val list4 = list.toMutableSet().toList()
//testSet03==>list4=[mcm, mlb, mk]
Log.d(TAG, "testSet03==>list4="+list4)
}
fun testArray01() {
val arr = intArrayOf(1,2,3,4)
//testArray01==>arr[0]=1, arr[1]=2, arr[3]=4
Log.d(TAG, "testArray01==>arr[0]="+arr[0] +", arr[1]="+arr[1]
+", arr[3]="+arr.elementAt(3))
//下面会越界Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=5
// Log.d(TAG, "testArray01==>arr[5]="+arr[5])
//arr[3]=4, arr[5]=-1
//下面的elementAtOrElse和elementAtOrNull可以避免下标越界异常
Log.d(TAG, "arr[3]="+arr.elementAtOrElse(3) { -1 }
+", arr[5]="+arr.elementAtOrElse(5) { -1 })
//arr[2]=3, arr[5]=下标越界
//elementAtOrNull + 空合并 ?:
Log.d(TAG, "arr[2]="+arr.elementAtOrNull(2)
+", arr[5]="+(arr.elementAtOrNull(5) ?: "下标越界"))
}
/**
* map集合
* 取值
*/
@RequiresApi(Build.VERSION_CODES.N)
fun testMap01() {
//map的两种创建方式
val map1 = mapOf<String, Double>(Pair<String, Double>("mcm", 3688.88), Pair("mk", 2888.88))
val map2 = mapOf<String, Double>("mcm" to (3688.88), "mk" to 2888.88)
//testMap01==>map1.value1=3688.88, value2=2888.88, value3=null, value4=null
//取值,方式一:通过[] 或 get取值,找不到会返回null, 背后对[]重载了
Log.d(TAG, "testMap01==>map1.value1="+map1["mcm"] + ", value2="+map1.get("mk")
+", value3="+map1["lv"] +", value4="+map1.get("mlb"))
// testMap01==>map2.value1=3688.88, value2=2888.88, value3=0.0, value4=0.0
//取值,方式二:getOrDefault,方式三: getOrElse
Log.d(TAG, "testMap01==>map2.value1="+map2.getOrDefault("mcm", 0.0)
+ ", value2="+map2.getOrElse("mk"){0.0}
+", value3="+map2.getOrDefault("lv", 0.0)
+", value4="+map2.getOrElse("mlb"){0.0})
//testMap01==>value1=3688.88
//取值,方式四:通过getValue(key)传key取值
Log.d(TAG, "testMap01==>value1="+map2.getValue("mcm"))
//方式四如果取不到值,会报错
// Caused by: java.util.NoSuchElementException: Key lv is missing in the map.
// Log.d(TAG, "testMap01==>+value2="+map2.getValue("lv"))
}
/**
* map集合
* 遍历
*/
@RequiresApi(Build.VERSION_CODES.N)
fun testMap02() {
val map = mapOf<String, Double>("mcm" to (3688.88), "mk" to 2888.88)
/**
* testMap02==>方式一...key=mcm, value=3688.88
* testMap02==>方式一...key=mk, value=2888.88
*/
//方式一:有默认的it, it == Map.Entry<String, Double>
map.forEach {
//内部持有一个it,it == Map.Entry<String, Double>
Log.d(TAG, "testMap02==>方式一...key=${it.key}, value=${it.value}")
}
//方式二:把默认的it 用key,value ->覆盖掉了
map.forEach { s, d ->
Log.d(TAG, "testMap02==>方式二...key="+s + " ," +d)
}
map.forEach {s : String ,d : Double ->
Log.d(TAG, "testMap02==>方式三...key="+s + " ," +d)
}
}
/**
* map可变集合
* 可变集合的操作:+= -= put
* 取值:getOrPut 有元素的情况和无元素的情况
*/
fun testMap03() {
val map = mutableMapOf<String, Double>("mcm" to (3688.88), "mk" to 2888.88)
map += "mlb" to 699.8
map += Pair("coach", 2988.8)
map -= "mcm"
map.put("ck", 888.88)
/**
* testMap03==>key=mk, value=2888.88
* testMap03==>key=mlb, value=699.8
* testMap03==>key=coach, value=2988.8
* testMap03==>key=ck, value=888.88
*/
//遍历
map.forEach {
Log.d(TAG, "testMap03==>key=${it.key}, value=${it.value}")
}
/**
* 1. getOrPut 没有元素的情况
* 如果map中没有fila元素,就先添加到map中,然后再从map中获取
*/
val result /*: Double*/ = map.getOrPut("fila") {
399.88
}
//testMap03==>result=399.88, 或这样取值:399.88
//result值类型就是<K, V>中的V类型,result值就是value值
Log.d(TAG, "testMap03==>result="+result+", 或这样取值:"+map["fila"])
/**
* 2. getOrPut 有元素的情况
* 如果map中有mk元素,就直接获取,相当于默认值3333.33就失效了
*/
val result2 /*: Double*/ = map.getOrPut("mk") {
3333.33
}
//testMap03==>result2=2888.88
Log.d(TAG, "testMap03==>result2="+result2)
}
}
网友评论