1.kotlin集合概述

  在kotli.collections包中包含List(有序集合)、Set(无序集合)、Map(健值对)三种集合

2.val定义的集合,调用集合方法可以添加删除,但是如果重新创建对象,则报错

val numbers = mutableListOf("one", "two", "three", "four")
numbers.add("five") // 这是可以的
//numbers = mutableListOf("six", "seven") // 编译错误

3.Collection

  Collection<T> 是集合层次结构的根。此接口表示一个只读集合的共同行为:检索大小、检测是否为 成员等等。Collection 继承自 Iterable <T> 接口,它定义了迭代元素的操作。可以使用Collection 作为适用于不同集合类型的函数的参数。对于更具体的情况,请使用 Collection 的 继承者:List 与 Set。

fun printAll(strings: Collection<String>) {
for (s in strings) print("$s ")
println()
} fun main() {
val stringList = listOf("one", "two", "one")
printAll (stringList) val stringSet = setOf("one", "two", "three")
printAll(stringSet)
}

  MutableCollection 是一个具有写操作的 Collection 接口,例如 add 以及 remove 。

fun List<String>.getShortWordsTo(shortWords: MutableList<String>, maxLength: Int) {
this.filterTo(shortWords) { it.length <= maxLength }
// throwing away the articles
val articles = setOf("a", "A", "an", "An", "the", "The")
shortWords -= articles
}
fun main() {
val words = "A long time ago in a galaxy far far away".split(" ")
val shortWords = mutableListOf<String>()
words.getShortWordsTo (shortWords, 3)
println(shortWords)//输出 [ago, in, far, far] }

4.List

  List<T> 以指定的顺序存储元素,并提供使用索引访问元素的方法。索引从 0 开始 ‒ 第一个元素的索引 ‒ 直到最后一个元素的索引即(list.size - 1)

    val numbers = listOf("one", "two", "three", "four")
println ("Number of elements: ${numbers.size}")
println("Third element: ${numbers.get(2)}")
println("Fourth element: ${numbers[3]}")
println("Index of element \"two\" ${numbers.indexOf("two")}")

  List元素(包括空值)可以重复:List可以包含任意数量的相同对象或单个对象的出现。如果两个List在相同的位置具有相同大小和相同结构的元素,则认为它们是相等的

val bob = Person("Bob", 31)
val people = listOf<Person>(Person("Adam", 20), bob, bob)
val people2 = listOf<Person>(Person("Adam", 20), Person("Bob", 31), bob)
println (people == people2)
bob.age = 32
println(people == people2)

  MutableList是可以进行写操作的 List,例如用于在特定位置添加或删除元素

val numbers = mutableListOf(1, 2, 3, 4)
numbers.add(5)
numbers.removeAt(1)
numbers[0] = 0
numbers.shuffle()
println(numbers)

  在 Kotlin 中,List 的默认实现是 ArrayList

5.Set

  Set<T> 存储唯一的元素;它们的顺序通常是未定义的.null元素也是唯一的:一个Set只能包含一个null.当两个set具有相同的大小并且对于一个 set 中的每个元素都能在另一个 set 中存在 相同元素,则两个 set 相等

val numbers = setOf(1, 2, 3, 4)
println("Number of elements: ${numbers.size}")
if (numbers.contains(1))
println("1 is in the set")
val numbersBackwards = setOf(4, 3, 2, 1)
println("The sets are equal: ${numbers == numbersBackwards}")

  MutableSet 是一个带有来自 MutableCollection 的写操作接口的 Set 。Set 的默认实现 - LinkedHashSet ‒ 保留元素插入的顺序。因此,依赖于顺序的函数,例如 first() 或 last(),会在这些 set 上返回可预测的结果。

val numbers = setOf(1, 2, 3, 4) // LinkedHashSet is the default implementation
val numbersBackwards = setOf(4, 3, 2, 1)
println(numbers.first() == numbersBackwards.first())
println(numbers.first() == numbersBackwards.last())

  另一种实现方式 ‒ HashSet ‒ 不声明元素的顺序,所以在它上面调用这些函数会返回不可预测的结果。 但是,HashSet 只需要较少的内存来存储相同数量的元素

6.Map

  Map<K, V> 不是 Collection 接口的继承者;但是它也是 Kotlin 的一种集合类型。Map 存储 键-值 对(或条目);键是唯一的,但是不同的键可以与相同的值配对。Map 接口提供特定的函数进行通过键访 问值、搜索键和值等操作。

val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)
println("All keys: ${numbersMap.keys}")
println("All values: ${numbersMap.values}")
if ("key2" in numbersMap) println("Value by key \"key2\": ${numbersMap["key2"]}")
if (1 in numbersMap.values) println("The value 1 is in the map")
if (numbersMap.containsValue(1)) println("The value 1 is in the map") // 同上

  MutableMap 是一个具有写操作的 Map 接口,可以使用该接口添加一个新的键值对或更新给定键的值。

val numbersMap = mutableMapOf("one" to 1, "two" to 2) 
numbersMap.put("three", 3)
numbersMap["one"] = 11
println(numbersMap)

  Map默认实现 LinkedHashMap,保留元素插入的顺序,使用HashMap不声明元素的顺序

7.构造集合

  7.1 由元素构造

    创建集合的最常用方法是使用标准库函数 listOf<T>()、setOf<T>()、mutableListOf<T> ()、mutableSetOf<T>()。如果以逗号分隔的集合元素列表作为参数,编译器会自动检测元素类型。 创建空集合时,须明确指定类型

val numbersSet = setOf("one", "two", "three", "four")
val emptySet = mutableSetOf<String>()

    同样的,Map 也有这样的函数 mapOf() 与 mutableMapOf()。映射的键和值作为 Pair 对象传递(通常使用中缀函数 to 创建)。

val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)

    注意,to 符号创建了一个短时存活的 Pair 对象,因此建议仅在性能不重要时才使用它。为避免过多 的内存使用,请使用其他方法。例如,可以创建可写 Map 并使用写入操作填充它。apply() 函数可以帮 助保持初始化流畅。

 val numbersMap = mutableMapOf<String, String>().apply { this["one"] = "1"; this["two"] = "2" }

  7.2 空集合

    还有用于创建没有任何元素的集合的函数:emptyList()、emptySet() 与 emptyMap()。创建空集 合时,应指定集合将包含的元素类型

val empty = emptyList<String>()

  7.3 list的初始化函数

    对于 List,有一个接受 List 的大小与初始化函数的构造函数,该初始化函数根据索引定义元素的值。

val doubled = List(3, { it * 2 }) // 如果你想操作这个集合,应使用 MutableList
println(doubled)

  7.4 具体类型构造函数

    要创建具体类型的集合,例如 ArrayList 或 LinkedList,可以使用这些类型的构造函数。类似的构造函数对于Set 与Map的各实现中均有提供

val linkedList = LinkedList<String>(listOf("one", "two", "three"))
val presizedSet = HashSet<Int>(32)

  7.5 复制

    要创建与现有集合具有相同元素的集合,可以使用复制操作。标准库中的集合复制操作创建了具有相同 元素引用的 浅 复制集合。因此,对集合元素所做的更改会反映在其所有副本中。

    在特定时刻通过集合复制函数,例如toList()、toMutableList()、toSet() 等等。创建了集合的快 照。结果是创建了一个具有相同元素的新集合 如果在源集合中添加或删除元素,则不会影响副本。副本也可以独立于源集合进行更改。

val sourceList = mutableListOf(1, 2, 3)
val copyList = sourceList.toMutableList()
val readOnlyCopyList = sourceList.toList()
sourceList.add(4)
println("Copy size: ${copyList.size}")
//readOnlyCopyList.add(4) // 编译异常
println("Read-only copy size: ${readOnlyCopyList.size}")

    这些函数还可用于将集合转换为其他类型,例如根据 List 构建 Set,反之亦然

val sourceList = mutableListOf(1, 2, 3)
val copySet = sourceList.toMutableSet()
copySet.add(3)
copySet.add(4)
println(copySet)

    或者,可以创建对同一集合实例的新引用。使用现有集合初始化集合变量时,将创建新引用。因此,当通过引用更改集合实例时,更改将反映在其所有引用中

val sourceList = mutableListOf(1, 2, 3)
val referenceList = sourceList
referenceList.add(4)
println("Source size: ${sourceList.size}")

    集合的初始化可用于限制其可变性。例如,如果构建了一个 MutableList 的 List 引用,当你试图通 过此引用修改集合的时候,编译器会抛出错误

val sourceList = mutableListOf(1, 2, 3)
val referenceList: List<Int> = sourceList
//referenceList.add(4) // 编译错误
sourceList.add(4)
println(referenceList) // 显示 sourceList 当前状态

  7.6 调用其他集合的函数

    可以通过其他集合各种操作的结果来创建集合。例如,过滤列表会创建与过滤器匹配的新元素列表:

val numbers = listOf("one", "two", "three", "four")
val longerThan3 = numbers.filter { it.length > 3 }
println(longerThan3)

    映射生成转换结果列表:

val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
println(numbers.mapIndexed { idx, value -> value * idx })

    关联生成 Map:

val numbers = listOf("one", "two", "three", "four")
println(numbers.associateWith { it.length })

kotlin集合——>集合概述、构造集合的更多相关文章

  1. Java集合框架概述和集合的遍历

    第三阶段 JAVA常见对象的学习 集合框架概述和集合的遍历 (一) 集合框架的概述 (1) 集合的由来 如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序. 通常,程序 ...

  2. Java集合源代码剖析(一)【集合框架概述、ArrayList、LinkedList、Vector】

    Java集合框架概述 Java集合工具包位于Java.util包下.包括了非常多经常使用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致能够分为例如以下五个部分:List ...

  3. wpf 导出Excel Wpf Button 样式 wpf简单进度条 List泛型集合对象排序 C#集合

    wpf 导出Excel   1 private void Button_Click_1(object sender, RoutedEventArgs e) 2 { 3 4 ExportDataGrid ...

  4. Android(java)学习笔记102:Map集合功能概述

    下面通过代码引入Map集合:如下 package cn.itcast_01; import java.util.HashMap; import java.util.Map; /* * 作为学生来说,是 ...

  5. Java基础知识强化之集合框架笔记50:Map集合之Map集合的概述和特点

    1. Map集合的概述: public interface Map<K,V> 作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取学生姓名,请 ...

  6. Java 集合系列之一:JCF集合框架概述

    容器,就是可以容纳其他Java对象的对象.Java Collections Framework(JCF)为Java开发者提供了通用的容器 java集合主要划分为四个部分: Collection(Lis ...

  7. Android(java)学习笔记41:Map集合功能概述

    1. 下面通过代码引入Map集合: 如下 package cn.itcast_01; import java.util.HashMap; import java.util.Map; /* * 作为学生 ...

  8. Java集合(一):Java集合概述

    注:本文基于JDK 1.7 1 概述 Java提供了一个丰富的集合框架,这个集合框架包括了很多接口.虚拟类和实现类. 这些接口和类提供了丰富的功能.可以满足主要的聚合需求. 下图就是这个框架的总体结构 ...

  9. 001-多线程-JUC集合-框架概述

    一.概述 1.1.java集合 java集合的架构,主体内容包括Collection集合和Map类:而Collection集合又可以划分为List(队列)和Set(集合). 1. List的实现类主要 ...

  10. Collection集合概述和集合框架介绍avi

    集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢?· ~集合︰集合是java中提供的一种容器,可以用来存储多个数据集合和数组既然都是容器,它 ...

随机推荐

  1. 【Vue2】Component 组件

    Main.JS入口函数,Vue的用法 //导入vue模块,得到Vue构造函数 import Vue from 'vue' // 导入根组件App.vue import App from './App. ...

  2. 【Spring-Security】Re05 权限控制及403处理

    一.访问控制方法及控制项: 上述配置中的URL后面都离不开的一个访问控制抉择: 1.全部允许 PermiAll 2.全部拒绝 DenyAll 3.允许匿名访问 Anonymous 也就是普通访问者 4 ...

  3. URDF(Universal Robot Description Format)—— 通用机器人描述格式URDF文件简介与生成

    参考: https://zhuanlan.zhihu.com/p/477556743 详细介绍资料: https://wiki.ros.org/urdf/XML

  4. ubuntu22.04系统环境下使用vs code安装pylint检查python的代码错误

    紧跟前文: ubuntu18.04系统环境下使用vs code安装pylint检查python的代码错误 pylint官网: https://pylint.pycqa.org/ =========== ...

  5. 2023 SMU RoboCom-CAIP 选拔赛

    前言 更详细题解可以参考咱学长的( 2023 SMU RoboCom-CAIP 选拔赛.zip A. 小斧头 f_k 表示满足条件的j = k 的(i,j)对的数量.如上图中第四行即为f1至f5的元素 ...

  6. Linux内存占用分析的几个方法,你知道几个?

    0. 引言: 系统内存是硬件系统中必不可少的部分,定时查看系统内存资源运行情况,可以帮助我们及时发现内存资源是否存在异常占用,确保业务的稳定运行. 例如:定期查看公司的网站服务器内存使用情况,可以确保 ...

  7. tar分段压缩导入

    压缩 ll drwxrwxrwx 4 postgres postgres 20480 Oct 10 14:54 gitee-repo #分段压缩 tar czf - gitee-repo/ | spl ...

  8. 折腾 Quickwit,Rust 编写的分布式搜索引擎 - 可观测性之分布式追踪

    概述 分布式追踪是一种跟踪应用程序请求流经不同服务(如前端.后端.数据库等)的过程.它是一个强大的工具,可以帮助您了解应用程序的工作原理并调试性能问题. Quickwit 是一个用于索引和搜索非结构化 ...

  9. 【YashanDB数据库】PHP无法通过ODBC连接到数据库

    [问题分类]驱动使用 [关键字]ODBC.驱动使用.PHP [问题描述]应用使用php-fpm+nginx架构,通过php的ODBC拓展连接YashanDB时出现报错: [unixODBC][Driv ...

  10. time series classification and transfer learning

    最近在看几篇最近几年的工作和survey,希望早点能做点东西.