Kotlin数据结构

数据结构基础

什么是数据结构

在计算机科学中,数据结构(Data Structure)是计算机中存储、组织数据的方式。数据结构是各种编程语言的基础。

一些使用场景

  1. 不同的数据结构适用于不同的应用场景。比如HashMap与ConcurrentHashMap,ArrayList与LinkedList。
  2. 使用正确的数据结构可以提高算法的效率(时间和空间)。比如使用Map(常数时间复杂度)将双重循环优化为一重循环。

数据之间的逻辑结构

  1. 线性结构:一对一
    在这里插入图片描述

  2. 树形结构:一对多
    在这里插入图片描述

  3. 图、网状结构:多对多
    在这里插入图片描述

  4. 集合:五顺序、不重复
    在这里插入图片描述

数据在计算机中的存储方式(存储结构)

  1. 顺序存储结构:把逻辑上相邻的元素存储在物理位置相邻的存储单元中
  2. 链式存储结构:对逻辑上相邻的元素不要求其物理位置相邻,元素间的逻辑关系通过指针来表示
  3. 索引存储结构:在存储节点的同时,还需要建立附加的索引表
  4. 散列存储结构:以数据元素的关键字的值为自变量,通过散列函数计算出该元素的存储位置

集合框架

现代编程语言及其API中都包含了多种默认的数据结构,Java集合框架、Kotlin集合框架就是其中的代表。
因为数据结构的知识体系比较广,除了各种线性、非线性结构,还有广义表、排序、查找,而排序中又有快速排序、堆排序等。对于大部分Android开发来说,更多的是直接使用编程语言的集合框架。所以接下来通过介绍Java和Kotlin集合框架来展开。

Java的集合框架

这里先通过介绍Java的集合框架来更好的引入Kotlin。
题外:针对Java的集合框架推荐梳理类图配合阅读源码及其注释的的方式来加深理解,同理对于Java的IO框架、Android的View框架、Android的Context框架也适用。

Collection类图

在这里插入图片描述

Map类图

在这里插入图片描述

纵向对比

在这里插入图片描述

Kotlin的集合框架

Collection类图

在这里插入图片描述

Map类图

在这里插入图片描述

Kotlin的集合创建

除了直接实例化Java的集合类之外,还可以使用标准库(stdlib)中的以下函数来创建

val listOf = listOf(1, 2, 3) //ArrayList
val arrayListOf = arrayListOf(1, 2, 3) // ArrayList
val mutableListOf = mutableListOf(1, 2, 3) // ArrayListval setOf = setOf(1, 2, 3) // LinkedHashSet
val hashSetOf = hashSetOf(1, 2, 3) // HashSet
val mutableSetOf = mutableSetOf(1, 2, 3) // LinkedHashSet val mapOf = mapOf("a" to 1, "b" to 2) // LinkedHashMap
val hashMapOf = hashMapOf("a" to 1, "b" to 2) // HashMap 
val mutableMapOf = mutableMapOf("a" to 1, "b" to 2) // LinkedHashMap

Kotlin集合的操作

Kotlin 标准库提供了用于对集合执行操作的多种函数。这包括简单的操作,例如获取或添加元素,以及更复杂的操作,包括搜索、排序、过滤、转换等。

转换

  • map:映射,返回将给定变换函数应用于原始集合中每个元素的结果的列表。
val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
val mapIndexed = numbers.mapIndexed { idx, value -> "$value + $idx" }
val s = mapIndexed[0]
println(s::class.java) // class java.lang.String
  • zip:压合,调用应用于每对元素的提供的变换函数,返回从此集合和具有相同索引的另一个集合的元素构建的列表。
val colors = listOf("red", "brown", "grey")
val animals = listOf("fox", "bear", "wolf", "dog")
println(colors.zip(animals) { color, animal -> "$color $animal"}) // [red fox, brown bear, grey wolf]
  • flatten:压平,返回给定集合中所有集合中所有元素的单个列表。
val numberSets = listOf(setOf(1, 2, 3), setOf(4, 5, 6), setOf(1, 2))
println(numberSets.flatten()) // [1, 2, 3, 4, 5, 6, 1, 2]

过滤

  • filter:过滤,返回仅包含满足条件的元素的列表。
val numberStr = listOf("one", "two", "three", "four")
val longerThan3 = numberStr.filter { it.length > 3 }
println(longerThan3) // [three, four]
  • partition:划分,将集合拆分为一对列表,其中第一个列表包含满足条件的元素,而第二个列表包含余下的元素。
val numberStr = listOf("one", "two", "three", "four")
val pair = numberStr.partition { it.length > 3 }
println(pair.first) // [three, four]
println(pair.second) // [one, two]

分组

  • groupBy:对集合的元素进行分组,并返回一个map。
val numberStr = listOf("one", "two", "three", "four")
val map = numberStr.groupBy { it.first() }
println(map) // {o=[one], t=[two, three], f=[four]}

排序

  • sorted:自然排序,排序算法是稳定的
val numberStr = listOf("one", "two", "three", "four")
println(numberStr.sorted()) // [four, one, three, two]
  • sortedWith:自定义排序
val numberStr = listOf("one", "two", "three", "four")
val lengthComparator = Comparator { str1: String, str2: String -> str1.length - str2.length }
println(numberStr.sortedWith(lengthComparator)) // [one, two, four, three]
  • sortedBy:自定义排序,内部调用的是sortedWith
val numberStr = listOf("one", "two", "three", "four")
println(numberStr.sortedBy { it.length }) // [one, two, four, three]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618734.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

哪些自主品牌「霸榜」30万元向上战场?硬派越野/MPV再助力

占乘用车市场不到20%份额的30万元以上价位,一直以来都是合资品牌的天下。现在,三家中国本土自主品牌已经率先突围。 高工智能汽车研究院监测数据显示,2023年1-7月,理想、比亚迪、蔚来进入30万元以上价位新车交付量TOP10&#xff…

Linux(基础IO、文件权限、Makefile)

目录 1、man 手册 1.1 汉化 1.2 具体使用 2、文件权限 2.1 权限理解 2.2 文件详细信息查询 2.3 权限更改 3、常用函数接口 3.1 open 3.2 read 3.3 write 3.4 close 3.5 函数使用示例 4、make与Makefile 4.1 make 与 Makefile区别 4.2 Makefile的编写 5、vim简…

多线程学习之解决线程同步的实现方法

一、卖票的多线程实现 需求:共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票 代码实现: /*** Author:kkoneone11* name:SellTicket1* Date:2023/8/26 11:32*/ public class S…

设计模式之八:迭代器与组合模式

有许多方法可以把对象堆起来成为一个集合(Collection),比如放入数组、堆栈或散列表中。若用户直接从这些数据结构中取出对象,则需要知道具体是存在什么数据结构中(如栈就用peek,数组[])。迭代器…

占领手机,银行App的隐秘战事

作者 | 辰纹 来源 | 洞见新研社 十几年前,银行用各类卡片塞满我们的钱包;如今,银行用各种App塞满我们的手机。 说出来可能很多人还不相信,民商智慧《2019银行业电子银行场景营销分析报告》就提到,在2019年3月时&…

Nginx详解 一:编译安装Nginx和Nginx模块

文章目录 1.HTTP 和 Nginx1.1 Socket套接字1.2 HTTP工作机制1.2.1一次http事务1.2.2 资源类型1.2.3提高HTTP连接性能 2. I/O模型2.1 I/O模型相关概念2.2 网络I/O模型2.2.1 **阻塞型** **I/O** 模型(blocking IO)2.2.2 **非阻塞型** **I/O** **模型** **(…

android 系统(20)---背光灯

图1 这是MTK 2011年的图,下面给出MT6575/6577中此部分的框架图: 图2 再来看更体现一些细节的框架图: 图3 由此可见光系统从上到下依次分为java APP层、java 框架层、本地层和驱动层。下面就来看APP层,先给出调节背光的应用界面…

Ubuntu16.04设置背光灯发亮快捷键

Ubuntu16.04设置背光灯发亮快捷键 分三步: 1.新建根目录 mkdir ~/bin2编辑背光灯控制开关的脚本文件 vim ~bin/ledctrl将以下内容复制 #!/bin/bash - # # # FILE: ledctrl # # USAGE: ./ledctrl # # DESCRIPTION: # # OPTIONS: …

Linux c++开发-02-g++命令行编译

有如下的文件目录结构 格式一 swap.h swap.cpp main.cpp 编译方法和结果如下: 格式二 swap.cpp main.cpp 使用命令:g main.cpp src/swap.cpp -o main.exe 解决方法使用参数 -I 格式三-将swap.cpp生成一个静态库然后链接到main.cpp中 生成…

C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】

全文目录 前言fseek 重定位位置指示器函数ftell 获取当前文件指示器的位置rewind 重置位置指示器文本文件和二进制文件文件读取结束的判定feof 和 ferror 文件缓冲区总结 前言 有了文件的顺序读写基础,那么肯定会好奇文件的随机读写,毕竟顺序读写对于有…

python抢票开发——设备预约助手实现

女朋友是药学院的,做实验时需要在特定的网站上进行设备预约,由于预约人数过多,从而导致从浏览器登录不进去或者登录进去预约失败等情况,所以我用python帮她写了一个抢位助手,让程序自动去进行位置预定,实测…

春节Python抢票神器,支持候补抢票真的无敌了

想要回家的小伙伴们,大概经历了一波抢票大战。 一年一度春运着实让人难熬 这次顺便把一个Python抢票工具,送到了GitHub趋势榜第一。 项目名很干脆,就是12306,来自名叫文贤平的程序员。 这很可能是全GitHub最德高望重的购票小助手了,功能一直在更新,且现已支持Python …

Java IO流动(实战操作)

目录 1 IO流原理2 IO流的分类3 输入、输出流代码示例4 小结5 文件在前后台之间传递 在Java中,IO流是一种用于处理输入和输出操作的机制。它提供了一种统一的方式来读取和写入数据,平日开发中在文件读写,网络通信,特定场景的数据库…

老话题,火车票抢票助手,简化版 (漏洞已经失效^_^)

用了“二杠”兄弟的工具测试了抢票,先举个大拇指。牛!可是我实在看不惯他画的界面,而且需要认证和访问他服务器上的wcf服务。看到许多园友都号称“破解”了。我也请出"Reflector"神器,尝试了下。发现把源exe文件作为app…

python模拟火车订票系统_如何用python编写火车抢票助手

前几天跟朋友说打算写一个抢票助手,最后由于某些原因念头打消了。 可就在昨天晚上,才隐约记起一年前的自己曾经说过:一年后我一定要写一个12306的抢票助手!瞬间激情澎湃,甚至已经是快临近凌晨时便开始动工,…

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html

Yolo系列-yolov3

YOLO-V3 这张图讲道理真的过分了!!!我不是针对谁,在座的各位都是 终于到V3了,最大的改进就是网络结构,使其更适合小目标检测特征做的更细致,融入多持续特征图信息来预测不同规格物体 先验框更丰…

java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架

网络游戏框架简介 ioGame 是一个由 java 语言编写的网络游戏服务器框架。支持 websocket、tcp ,适用于全球同服、回合制游戏、策略游戏、即时战斗等游戏服务器的开发。具有高性能、稳定、易用易扩展、超好编程体验等特点。可做为 H5、手游、端游的 java 游戏服务器…

游戏服务器架构通识

前言 这节讲座里,我们将从游戏服务器发展的简单历程出发,鸟瞰一下目前大多数的游戏服务器架构。 这里尽可能的避免陷入细节的技术问题,而是从技术进化的结果状态,反推原始问题是什么。希望能通过这个过程,解释清楚游戏…

游戏服务器架构设计整理

文章目录 前言一、单进程多线程的服务器设计模式,只有一个进程,但一个进程包好多个线程二、多进程单线程的服务器设计模式,多个进程,每个进程只有一个线程1.早期的MMORPG服务器结构2.中期-用户分离集群式3.中后期数据分离集群式4.…