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&…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...