9.常见集合

news2024/12/28 5:52:22

目录

  • 一、三种常见集合
  • 二、Vector
    • 2.1 特性
    • 2.2 创建并更新Vector
    • 2.3 读取Vector中的元素
    • 2.4 遍历元素
    • 2.5 储存不同类型的值
  • 三、字符串
    • 3.1 概念
    • 3.2 新建
    • 3.2 更新
    • 3.3 索引字符串
    • 3.4 字符串切片
    • 3.5 字符串遍历
  • 四、哈希map
    • 4.1 基本概念
    • 4.2 新建哈希map
    • 4.3 访问哈希map中的值
    • 4.4 更新哈希map

一、三种常见集合

  • 字符串(string)是字符的集合;
  • vector:一个挨着一个地储存一系列数量可变的值;
  • 哈希map(hash map):将值与一个特定的键(key)相关联;

其它类型的集合参见:https://rustwiki.org/zh-CN/std/collections

二、Vector

2.1 特性

  • 允许在一个单独的数据结构中储存多个值;
  • 所有值在内存中彼此相邻排列;
  • vector 只能储存相同类型的值。

2.2 创建并更新Vector

  • 使用Vec::new()创建;
  • 使用vec!宏创建;
  • 使用push压入数据;
fn main() {
    let mut x = Vec::new(); //创建可变的空Vector
    x.push(38);                       //压入数据

    let y = vec![0, 5, 18, 19];  //使用宏创建,直接存入初始数据
    // y.push(40);  //非可变,不可压入
}

2.3 读取Vector中的元素

  • 使用&[i]返回引用
  • 使用get方法返回一个Option<&T>

&[i]返回

fn main() {
 	let v = vec![1, 2, 3, 4, 5];
 	let v8 = &v[8];
}

上面的代码运行时会报错,根据提示可知,索引超出范围了。
在这里插入图片描述

get方法返回

fn main() {
    let v = vec![1, 2, 3, 4, 5];
    let v9 = v.get(9);
    println!("v9 = {:#?}", v9);
}

上面的代码输出v9 = None ,代表没有找到,由于get方法返回Option<&T>,所以可以使用match匹配;

完整示例

  • 使用get时用match匹配,超出索引时输出错误信息
fn main() {
let v = vec![1, 2];

let third: &i32 = &v[1];
println!("The first element is {}", third);

match v.get(3) {
    Some(third) => println!("The third element is {}", third),
    None => println!("There is no third element."),
}
}

更多的信息参阅:https://doc.rust-lang.org/stable/nomicon/vec/vec.html

2.4 遍历元素

//遍历Vector
fn display_vec(src: &Vec<i32>)
{
    for item in src{
        println!("{}", item);
    }
}

fn main() {
    let mut v = vec![100, 32, 57];
    display_vec(&v);

    for item in &mut v{
        *item +=  10;   //每一项都加10
    }

    display_vec(&v);
}

2.5 储存不同类型的值

  • 一般来说vector存储的数据类型必须相同
  • 可以使用枚举的附加值属性存储不同类型值;

下面的代码表示从Excel中获取一行数据值,这一行值有整数,浮点数及字符串,这样就能存储不同类型的值。

enum SpreadsheetCell {
    Int(i32),
    Float(f64),
    Text(String),
}

fn main() {
    let row = vec![
        SpreadsheetCell::Int(3),
        SpreadsheetCell::Text(String::from("blue")),
        SpreadsheetCell::Float(10.12),
    ];
}

三、字符串

3.1 概念

  • Rust的核心语言中只有一种字符串类型:str,即字符切片&str,它被储存在程序的二进制输出中;
  • String由标准库提供,它是可增长、可变、有所有权以及UTF8编译的字符串类型;
  • 通常说的“字符串”,一般是string或者字符切片
  • 标准库中还包含一系列其他字符串类型,比如OsString、OsStr、CString和CStr,不同的后缀代表它是String或&str的变体;

3.2 新建

  • 创建一个空的然后写入;
  • 从字符串字面量转换;
  • 将字符串字面量转换成String;
fn main() {
    let a = String::new();              //创建空的
    let b = String::from("hello");      //从字符串字面量转换而来
    let c = "hello".to_string();        //将字符串字面量转换成String
}

字符串是UTF8编译的,可以包含任何正确编码的数据

不同语言的“你好"(还是中文的最好看)

fn main() {
    let hello = String::from("السلام عليكم");
    let hello = String::from("Dobrý den");
    let hello = String::from("Hello");
    let hello = String::from("שָׁלוֹם");
    let hello = String::from("नमस्ते");
    let hello = String::from("こんにちは");
    let hello = String::from("안녕하세요");
    let hello = String::from("你好");
    let hello = String::from("Olá");
    let hello = String::from("Здравствуйте");
    let hello = String::from("Hola");
}

3.2 更新

  • 使用push_strpush附加;
  • 使用+或者format!宏拼接;

附加更新

fn main() {
    let mut s = String::new();
    s.push('H');                  //附加一个字符
    s.push_str(" Zhong");     //附加一串字面量

    println!("s = {}", s);       //s = H Zhong
}

拼接更新

  • 使用+拼接会转移运算符前面变更的所有权
  • 运算符后面参数用引用
  • format!宏用起来更灵活,不会获取任何参数的所有权
fn main() {
    let s1 = String::from("NiHao");
    let s2: String = String::from("China!");

    let s3 = s1 + &s2;    //获取s1的所有权后拼接上s2的内容,返回所有权

    let s4 = format!("{} {}, I love {}", s2, s2, s2);
    // println!("s1 = {}", s1);    //s1的所有权不在这里了,无法打印
    println!("s2 = {}", s2);       //s2 = China!
    println!("s3 = {}", s3);       //s3 = NiHaoChina!
    println!("s4 = {}", s4);       //s4 = China! China!, I love China!
}

3.3 索引字符串

Rust无法用索引获取字符串,如

fn main() {
    let s1 = String::from("NiHao");
    let x0 = s1[0];
}

报错信息如下在这里插入图片描述

3.4 字符串切片

Rust不支持索引字符串,但是支持字符串切片,如

fn main() {
    let s1 = String::from("NiHao"); 
    println!("{} {}", &s1[..1], &s1[2..5]);
}

3.5 字符串遍历

  • chars方法:返回字符
  • bytes方法:返回原始字节
fn main() {
    let s1 = String::from("NiHao");
    
    for c in s1.chars() {
        println!("{}",c);
    }
    println!("************");
    for c in s1.bytes() {
        println!("{}",c);
    }
}

运行结果
在这里插入图片描述

四、哈希map

4.1 基本概念

  • 哈希map(hash map)使用HashMap<K, V>储存键值对;
  • 可以用于需要任何类型作为键来寻找数据;
  • 哈希map中所有的键必须是相同类型,值也必须都是相同类型
  • 将诸如拥有所有权的String插入hash map,其所有权也会被转移

4.2 新建哈希map

  • 使用new创建空的,然后使用insert增加元素;
  • 使用一个元组的vector的collect方法(其中每个元组包含一个键值对);
  • 使用collect方法时必须显式指定
use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();   //创建空hash map,然后插入

    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);

    let teams  = vec![String::from("Blue"), String::from("Yellow")];
    let initial_scores = vec![10, 50];

    let scores: HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();  //由两个vector一对一组成hash map
}

所有权被改变示例

use std::collections::HashMap;

fn main() {
    let field_name = String::from("Favorite color");
    let field_value = String::from("Blue");
    
    let mut map = HashMap::new();
    map.insert(field_name, field_value);
    
    println!("field_name = {}", field_name);
    println!("field_value = {}", field_value);
}

编译出错
在这里插入图片描述

4.3 访问哈希map中的值

  • 通过get方法访问
  • 遍历访问

get方法

  • get方法返回Option<V>,结果被装进Some中,如果键没有对应的值,就会返回None。
use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    
    let team_name = String::from("Blue");
    let score = scores.get(&team_name);
}

遍历方法

use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    
    for (key, value) in &scores {
        println!("{}: {}", key, value);
    }
}

运行结果

Yellow: 50
Blue: 10

4.4 更新哈希map

  • 覆盖值
  • 不存在时插入
  • 根据旧值更新三种情况

覆盖值

use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Blue"), 50);   // 强制更新
    
    println!("{:?}", scores);  //{"Blue": 50}
}

不存在时插入

  • entry可以将想要检查的键作为参数,返回枚举Entry
  • or_insert方法在键对应的值存在时就返回这个值的可变引用(&mut V),如果不存在则将参数作为新值插入并返回新值的可变引用
  • 使用entry配合or_insert可以达到目的;
use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);
    scores.entry(String::from("Yellow")).or_insert(50);  //”Yellow"如果不存在,插入  "Yellow:50"
    scores.entry(String::from("Blue")).or_insert(50);    //”Blue"如果不存在,插入  "Blue:50"

    println!("{:?}", scores);  //{"Yellow": 50, "Blue": 10}
}

根据旧值更新

代码统计单词在一句话中出现的次数

use std::collections::HashMap;

fn main() {
    let text = "hello world wonderful world";

    let mut map = HashMap::new();
    
    for word in text.split_whitespace() {
        let count = map.entry(word).or_insert(0);
        *count += 1;
    }
    
    println!("{:?}", map);  //{"world": 2, "wonderful": 1, "hello": 1}
}

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

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

相关文章

使用adb通过wifi连接手机

1&#xff0c;手机打开开发者模式&#xff0c;打开无线调试 2&#xff0c;命令行使用adb命令配对&#xff1a; adb pair 192.168.0.102:40731 输入验证码&#xff1a;422859 3&#xff0c;连接设备&#xff1a; adb connect 192.168.0.102:36995 4&#xff0c;查看连接状态:…

【云岚到家】-day03-2-门户缓存实现实战

【云岚到家】-day03-2-门户缓存实现实战 5 缓存实现5.2 定时任务更新缓存5.2.1 分布式调度平台5.2.1.1 jdk提供的Timer定时器5.2.1.2 使用第三方Quartz方式5.2.1.3 使用分布式调度平台XXL-JOB 5.2.2 XXL-JOB5.2.2.1 介绍5.2.2.2 部署调度中心5.2.2.3 执行器 5.2.2 定义缓存更新…

二开版视频CMS完整运营源码/新版漂亮APP手机模板/集成员分销功能等

一个二开的影视CMS&#xff0c;直接上传源码至网站根目录&#xff0c;访问网站域名即可安装。 测试环境&#xff1a;Nginx 1.20.1—MySQL 5.6.50–PHP-7.2&#xff08;安装拓展/fileinfo&#xff09; 上传源码&#xff0c;访问域名直接安装 后台地址&#xff1a;域名/MDadmi…

4. 案例研究-接口程序

4. 案例研究-接口程序 本章通过一个案例研究, 来展示设计互相配合的函数的过程.4.1 turtle 模块 创建一个文件mypolygon.py, 并输入如下代码:import turtle bob turtle.Turtle() print(bob)# 这一句的作用是让画板停留, 等手动点击x关闭画板, 程序才结束. # 否则程序执行完毕…

Spring中的IOC

IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是Spring框架核心概念之一。它是一种设计原则&#xff0c;用来实现对象的松耦合和依赖管理。在传统的编程中&#xff0c;对象负责创建或查找其依赖对象&#xff0c;而在IOC模式下&#xff0c;这些职责被移…

C++ | Leetcode C++题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {int n tokens.size();vector<int> stk((n 1) / 2);int index -1;for (int i 0; i < n; i) {string& token tokens[i];if (token.length() >…

24年大一尺取练习(东北林业大学)

前言&#xff1a; 今天下午才刚看到oj上发了这次练习&#xff0c;我已经错过了截止时间&#xff0c;刚好不是很想复习六级&#xff0c;就把这次练习补了吧。 正文&#xff1a; Problem:A 尺取Language&#xff1a; #include<bits/stdc.h> using namespace std; const i…

如何把路由器设备的LAN口地址为三大私网地址

要将路由器的LAN口地址配置为三大私有IP地址范围之一&#xff08;10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16&#xff09;&#xff0c;我们需要访问路由器的管理界面并进行相应的设置。 下面是步骤&#xff1a; 连接到路由器&#xff1a; 连接到路由器的管理界面&#xf…

C++设计模式——Bridge桥接模式

一&#xff0c;桥接模式简介 桥接模式是一种结构型设计模式&#xff0c;用于将抽象与实现分离&#xff0c;这里的"抽象"和"实现"都有可能是接口函数或者类。 桥接模式让抽象与实现之间解耦合&#xff0c;使得开发者可以更关注于实现部分&#xff0c;调用…

谷粒商城实战(036 k8s集群学习2-集群的安装)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第343p-第p345的内容 k8s 集群安装 kubectl --》命令行操作 要进入服务器 而且对一些不懂代码的产品经理和运维人员不太友好 所以我们使用可视化…

【5.x】ELK日志分析

ELK日志分析 一、ELK概述 1、ELK简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch、Logstash和Kiabana三个开源工具配合使用&#xff0c;完成更强大的用户对日志的查询、排序、统计需求。 一个完整的集中式日志系统&#xff0c;需要包含以下几个主…

Java | Leetcode Java题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution {public int maxPoints(int[][] points) {int n points.length;if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i) {if (ret > n - i || ret > n / 2) {break;}Map<Integer, Integer> map ne…

SpringBoot系列——使用Spring Cache和Redis实现查询数据缓存

文章目录 1. 前言2. 缓存2.1 什么是缓存2.2 使用缓存的好处2.3 缓存的成本2.4 使用Spring Cache和Redis的优点 3. Spring Cache基础知识3.1 Spring Cache的核心概念3.2 Spring Cache的注解3.2.1 SpEL表达式3.2.2 Cacheable3.2.3 CachePut3.2.4 CacheEvict 4. 实现查询数据缓存4…

eclipse创建maven项目

第一步&#xff1a;打开eclipse 我们选择java项目即可 点击finish即可 它会自动下载插件 然后在控制台上输入Y即可

C语言 | Leetcode C语言题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; int evalRPN(char** tokens, int tokensSize) {int n tokensSize;int stk[(n 1) / 2];memset(stk, 0, sizeof(stk));int index -1;for (int i 0; i < n; i) {char* token tokens[i];if (strlen(token) > 1 || isdigit(token[0])…

LeetCode | 28.找出字符串中第一个匹配项的下标 KMP

这是字符串匹配问题&#xff0c;朴素做法是两重遍历&#xff0c;依次从主串的i位置开始查看是否和模式串匹配&#xff0c;若不匹配就换下一个位置进行判断&#xff0c;直到找到或者遍历完&#xff0c;时间复杂度 O ( m n ) O(m \times n) O(mn) 还可以对主串进行处理&#xff…

Django 5 Web应用开发实战

文章目录 一、内容简介二、目录内容三、值得一读四、适读人群 一、内容简介 《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体&#xff0c;是一本从零基础到精通Django Web企业级开发技术的实战指南。《Django 5 Web应用开发实战》内容以Python 3.x和…

边坡监测规范:确保边坡工程安全稳定的专业准则

边坡工程是土木工程中不可或缺的一部分&#xff0c;其安全性直接关系到工程整体的质量与稳定性。因此&#xff0c;在边坡工程中实施有效的监测措施&#xff0c;遵循一系列专业的监测规范&#xff0c;对于预防边坡失稳、滑坡等灾害的发生&#xff0c;保障人民群众的生命财产安全…

Leetcode 力扣119. 杨辉三角 II (抖音号:708231408)

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1]提示…

Golang | Leetcode Golang题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; func evalRPN(tokens []string) int {stack : make([]int, (len(tokens)1)/2)index : -1for _, token : range tokens {val, err : strconv.Atoi(token)if err nil {indexstack[index] val} else {index--switch token {case ""…