Ruby语言的数据结构
Ruby语言的数据结构详解
Ruby是一种动态、面向对象的编程语言,因其简洁优雅的语法而受到开发者的喜爱。在Ruby中,数据结构是构建和管理数据的一种方式,不同的数据结构适用于不同的场景。本文将详细探讨Ruby中的几种主要数据结构,包括数组、哈希、集合和链表,同时也会讨论它们的特性、使用场景及实例。
一、数组(Array)
数组是Ruby中最基础的数据结构之一,它是一种有序的集合,可以存储一系列元素。Ruby中的数组可以存放不同类型的数据,包括数字、字符串、对象等。数组的索引从0开始,支持动态扩展。
1. 数组的创建与初始化
在Ruby中,可以使用Array类的实例方法来创建数组,也可以使用简洁的字面量表示法。
```ruby
使用字面量创建数组
array1 = [1, 2, 3, 4, 5] array2 = ["apple", "banana", "cherry"]
使用Array.new创建数组
array3 = Array.new(5) # 创建一个包含5个nil的数组 array4 = Array.new(3, 'hello') # 创建一个包含3个'hello'的数组 ```
2. 数组的操作
Ruby中的数组支持大量的操作方法,常用的有:
push和pop:向数组末尾添加或移除元素。shift和unshift:从数组开头添加或移除元素。map、select、reject:对数组进行遍历操作,返回新数组。each:遍历数组中的每个元素。
ruby array = [1, 2, 3] array.push(4) # [1, 2, 3, 4] array.pop # 4 array.shift # 1 array.unshift(0) # [0, 2, 3]
3. 数组的切片与拼接
Ruby提供了一些方法来操作数组的部分元素。例如,slice方法和concat方法。
ruby array = [1, 2, 3, 4, 5] sliced = array[1..3] # [2, 3, 4] array.concat([6, 7]) # [1, 2, 3, 4, 5, 6, 7]
4. 数组的排序与查找
数组也提供了一些排序和查找的方法。使用sort可以进行排序,使用include?可以判断某个元素是否存在。
ruby array = [5, 3, 1, 4, 2] sorted_array = array.sort # [1, 2, 3, 4, 5] exists = array.include?(3) # true
二、哈希(Hash)
哈希是一种键值对集合的数据结构,它可以通过键快速访问对应的值。Ruby中的哈希是无序的,键值对的顺序不一定是插入的顺序。
1. 哈希的创建与初始化
哈希可以通过Hash类的实例方法或字面量表示法进行创建。
```ruby
使用字面量创建哈希
hash1 = { "name" => "Alice", "age" => 25 } hash2 = { name: "Bob", age: 30 } # 使用符号作为键
使用Hash.new创建哈希
hash3 = Hash.new { |hash, key| hash[key] = [] } # 默认值为空数组 ```
2. 哈希的操作
哈希提供了丰富的方法来操作键值对:
store、[]=:添加或更新元素。fetch:获取指定键的值,如果不存在则可以给出默认值。delete:移除指定键的键值对。
ruby hash = { name: "Alice", age: 25 } hash[:gender] = "female" # 添加新的键值对 age = hash.fetch(:age) # 25 hash.delete(:name) # 删除:name键
3. 哈希的迭代与查询
哈希支持类似数组的迭代方法,如each、each_key、each_value等。
ruby hash = { a: 1, b: 2, c: 3 } hash.each do |key, value| puts "#{key} => #{value}" end
4. 哈希的合并与比较
两个哈希可以使用merge方法进行合并,使用==进行比较。
ruby hash1 = { a: 1, b: 2 } hash2 = { b: 3, c: 4 } merged_hash = hash1.merge(hash2) # { a: 1, b: 3, c: 4 } is_equal = hash1 == hash2 # false
三、集合(Set)
集合是一种不允许重复元素的数据结构。在Ruby中,集合可以通过Set类来实现。使用集合可以方便地进行数学上的集合操作,如交集、并集等。
1. 集合的创建
要使用集合,首先需要require 'set'。
```ruby require 'set'
set1 = Set.new([1, 2, 3]) set2 = Set.new([2, 3, 4]) ```
2. 集合的操作
集合支持一些基本操作,如添加、删除元素以及集合运算。
ruby set1.add(4) # 添加元素4 set1.delete(2) # 删除元素2 union_set = set1 | set2 # 并集 intersection_set = set1 & set2 # 交集
3. 集合的迭代
集合也支持迭代操作。
ruby set1.each do |element| puts element end
四、链表(LinkedList)
链表是一种更复杂的数据结构,由一系列节点构成,每个节点包含数据和指向下一个节点的指针。在Ruby中,并没有内置的链表类,但我们可以自定义链表。
1. 节点类
首先定义一个节点类。
```ruby class Node attr_accessor :value, :next_node
def initialize(value) @value = value @next_node = nil end end ```
2. 链表类
接着定义链表类。
```ruby class LinkedList attr_accessor :head
def initialize @head = nil end
def append(value) new_node = Node.new(value) if @head.nil? @head = new_node else current = @head current = current.next_node while current.next_node current.next_node = new_node end end
def display current = @head while current puts current.value current = current.next_node end end end ```
3. 链表的操作
通过定义的链表类,可以进行添加、显示等操作。
ruby list = LinkedList.new list.append(1) list.append(2) list.append(3) list.display # 输出1, 2, 3
总结
Ruby是一种功能强大的编程语言,提供了多种数据结构以满足不同的开发需求。数组、哈希和集合是常用的基本数据结构,它们具有各自独特的特点和适用场景;而链表则为复杂的数据操作提供了灵活的解决方案。
通过合理选择数据结构,可以提高代码的可读性和运行效率。在应用程序开发的过程中,深入理解这些数据结构的特性和操作将帮助我们更好地解决问题。在不断学习和应用中,熟悉Ruby的各种数据结构将为我们的编程之旅增添强大的助力。
相关文章:
Ruby语言的数据结构
Ruby语言的数据结构详解 Ruby是一种动态、面向对象的编程语言,因其简洁优雅的语法而受到开发者的喜爱。在Ruby中,数据结构是构建和管理数据的一种方式,不同的数据结构适用于不同的场景。本文将详细探讨Ruby中的几种主要数据结构,…...
Jmeter配置服务代理器 Proxy(二)
1.创建脚本记录器 2.配置:Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考:使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面,生成了证书: 5.给浏览器安装Jmeter代理的证书…...
Spring Boot 中实现 WebSocket 的方式
在 Spring Boot 中实现 WebSocket 的方式主要有以下几种,每种方式适用于不同的场景和需求: 1. 基于 Spring WebSocket 的实现 特点: 原生支持 WebSocket,基于 Spring 提供的 API。使用 WebSocketConfigurer 和 WebSocketHandler 配置端点和消息处理逻辑。可以通过拦截器访…...
C语言初阶习题【29】杨氏矩阵
1. 题目描述——杨氏矩阵 有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。 要求:时间复杂度小于O(N); 2. 思路 3. 代码实现1 #include<stdio.h>void fin…...
[操作系统] 深入理解操作系统的概念及定位
概念 任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。 其核心功能如图片所示,包括: 内核 (Kernel): 内核是操作系统的核心部分,被认为是狭义上的操作系统,直接与硬件打交道。负责进程管理、内…...
Java中对list数据进行手动分页(可直接复用版)
1.获取list列表数据 // 这边用的mybatisplus查询的sql。条件自己组装 List<实体类> result baseMapper.getPageData(lambdaQuery); 2.计算总记录数 // 计算总记录数 int totalRecords result.size(); 3.创建分页对象,并塞入结果值 // 创建分页对象 IPa…...
【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页
【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页 一、问题背景: 如今,大家都离不开各种手机应用。随着鸿蒙系统用户越来越多,大家都希望能在鸿蒙设备上快速找到想用的 APP。华为应用市场里有海量的 APP,但之前从鸿蒙设备进…...
《研发管理 APQP 软件系统》——汽车电子行业的应用收益分析
全星研发管理 APQP 软件系统在汽车电子行业的应用收益分析 在汽车电子行业,技术革新迅猛,市场竞争激烈。《全星研发管理 APQP 软件系统》的应用,为企业带来了革命性的变化,诸多收益使其成为行业发展的关键驱动力。 《全星研发管理…...
【IDEA 2024】学习笔记--文件选项卡
在我们项目的开发过程中,由于项目涉及的类过多,以至于我们会打开很多的窗口。使用IDEA默认的配置,个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…...
Android SystemUI——服务启动流程(二)
在 Andorid 系统源码中,package/apps下放的是系统内置的一些 APP,例如 Settings、Camera、Phone、Message 等等。而在 framework/base/package 下,它们也是系统的 APP,SystemUI 就在此目录下。它控制着整个 Android 系统的界面,但其实他也是一个 APP,不同于一般的 APP,它…...
iOS - 内存对齐
1. 基本的内存对齐 // 对象内存对齐 struct objc_object {// isa 指针 8 字节对齐isa_t isa __attribute__((aligned(8))); };// 定义对齐常量 #define WORD_MASK 7UL // 字对齐掩码 #define WORD_SHIFT 3UL // 字对齐位移 #define WORD_SIZE 8 …...
小游戏前端地区获取
目前前端获取除了太平洋,没有其它的了。 //在JS中都是使用的UTF-8,然而requst请求后显示GBK却是乱码,对传入的GBK字符串,要用数据流接收,responseType: "arraybuffer" tt.request({url: "https://whoi…...
AIGC时代:如何快速搞定Spring Boot+Vue全栈开发
文章目录 一、Spring Boot基础二、Vue.js基础三、Spring Boot与Vue.js集成四、性能优化与最佳实践《快速搞定Spring BootVue全栈开发》 内容简介作者简介目录前言/序言本书内容本书特点读者对象 随着人工智能生成内容(AIGC)技术的迅速发展,…...
MDX语言的多线程编程
MDX语言的多线程编程 引言 多线程编程是一种重要的编程技术,广泛用于提高程序的运行效率和响应速度。随着计算机硬件的发展,多核处理器的普及,多线程编程显得尤为重要。MDX(Multi-dimensional Expressions)语言作为一…...
Vue.js组件开发-实现输入框与筛选逻辑
在Vue.js组件开发中,实现输入框与筛选逻辑通常涉及创建一个输入框组件,让用户能够输入搜索关键字,并根据这些关键字过滤一个数据列表。 步骤 准备数据: 在Vue组件中,准备一个数据列表(通常是一个数组…...
配置Allure环境变量【macOS版】
1. 进入github官网,搜索allure 点击进入,下滑找到Download栏目,点击release 2. 下载安装包并解压 我下载的是zip,解压至存放目录,复制该目录。(一会配置环境变量用) 3. 编辑.zsrch文件&…...
AndroidStudio升级到2024.2.2项目AGP升级8.8.0版本记录
背景 升级as,一般会把agp一起升级。我的原来版本是8.7.2 plugins {id com.android.application version 8.7.2 apply falseid com.android.library version 8.7.2 apply falseid org.jetbrains.kotlin.android version 1.8.10 apply false }升级后版本:…...
Require:利用MySQL binlog实现闪回操作
1,闪回原理 【binlog】MySQL binlog以event的形式,记录了MySQL server从启用binlog以来所有的变更信息,能够帮助重现这之间的所有变化。MySQL引入binlog主要有两个目的:一是为了主从复制;二是某些备份还原操作后需要重…...
计算机网络 (40)域名系统DNS
前言 计算机网络域名系统DNS(Domain Name System)是互联网的基础技术之一,它负责将人类可读的域名转换为计算机用来通信的数字IP地址。 一、基本概念 DNS的主要目的是将域名解析或翻译为IP地址,使得用户可以通过简单易记的域名来访…...
UE5游戏性能优化指南
UE游戏性能和场景优化思路: 1. 可以把可延展性调低,帧率会大幅提高,但画质会大幅降低 2.调整固定灯光,静态光源,烘焙构建光照,灯光重叠距离,关闭阴影 3.设置模型和地形LOD 4.开启Nanite&…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
