Rust Map指南:深入理解、輕鬆應用

2024.01.11

今天我們來聊聊Rust 中的map知識,在其他語言一樣,Map 通常指的是一種資料結構和一系列操作,用於將一組值映射到另一組值或執行某些操作,也就是我們常說的鍵值對。接下來一起探討Rust 中map 的基本用法,和常見操作以及一些有用的技巧。

什麼是map?

在Rust 中map是一種非常重要資料結構,和其他語言類似,也是一種鍵-值儲存的集合。它能夠允許你將一個鍵與一個值相關聯,然後就方便透過鍵來檢索值。以下是簡單例子,在Rust中,map通常透過std::collections::HashMap來實作。

use std::collections::HashMap;

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

    scores.insert("Alice", 100);
    scores.insert("Bob", 90);
    scores.insert("Charlie", 95);

    let alice_score = scores.get("Alice");

    match alice_score {
        Some(score) => println!("Alice's score is: {}", score),
        None => println!("Alice's score is not available."),
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

運行結果:

Alice's score is: 100

[Done] exited with code=0 in 0.689 seconds
  • 1.
  • 2.
  • 3.

在上面的範例中,建立了一個名為scores的HashMap,並將三個鍵值對插入其中。使用get方法來檢索"Alice" 的分數。

  • 其中match alice_score { ... } ,作用是它用來匹配alice_score的值,並根據匹配結果執行不同的程式碼區塊。
  • Some(score) => println!("Alice's score is: {}", score):這是一個匹配分支。它檢查alice_score是否包含Some值。
  • None => println!("Alice's score is not available."):這是另一個符合分支,用來處理alice_score為None的情況。

在Rust 語言還是挺好用的這些匹配規則。

基本操作

1.插入和更新值

如果你要在HashMap中插入新的鍵值對,可以使用insert方法。如果鍵已經存在,它將把值覆蓋掉。

scores.insert("Alice", 105);  // 更新Alice的分数
scores.insert("Eve", 80);      // 插入新的键值对
  • 1.
  • 2.

2.獲取值

要取得HashMap中的值,可以使用get方法,和Java 是不是很類似。如果鍵不存在,它會回傳一個Option。

// let alice_score = scores.get("test"); // 键不存在,将会打印出 None
let alice_score = scores.get("Alice");
match alice_score {
    Some(score) => println!("Alice's score is: {}", score),
    None => println!("Alice's score is not available."),
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

3.刪除值

也可以對HashMap中的鍵值對進行刪除操作,可以使用remove方法。

scores.remove("Bob");
  • 1.

4.遍歷

除上面增刪改操作,還有一個重要的,如果遍歷HashMap中的所有鍵值,這裡使用迭代器。

use std::collections::HashMap;

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

    scores.insert("Alice", 100);
    scores.insert("Bob", 90);
    scores.insert("Charlie", 95);
    scores.insert("Alice", 105);

    // 遍历
    for (key, value) in &scores {
        println!("{}: {}", key, value);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

遍歷結果:

Charlie: 95
Alice: 105
Bob: 90

[Done] exited with code=0 in 0.521 seconds
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

除了上面介紹的常見操作以外,其實HashMap還提供了許多有用的方法,例如查找鍵是否存在、取得鍵的集合、取得值的集合等等。這些方法在實際開發中,可以根據需要靈活使用,非常方便。

5.預設值

首先,來看第一個,預設值,這個作用是如果鍵不存在,你可以使用entry方法來設定預設值。

let charlie_score = scores.entry("Charlie").or_insert(0);
  • 1.

6.更新值

另外還可以使用entry方法來更新值,這就更加有趣了,可以讓你在原有值的基礎上執行操作,用起來也是挺爽是不是。

let bob_score = scores.entry("Bob").or_insert(0);
*bob_score += 5;
  • 1.
  • 2.

7.排序

最後一個,如果需要按鍵或值對HashMap進行排序,你可以將它們提取到Vec中,然後使用sort方法來排序。

let mut score_vec: Vec<(&str, &i32)> = scores.iter().collect();
score_vec.sort_by(|a, b| b.1.cmp(a.1));  // 按值降序排序
  • 1.
  • 2.
  • scores.iter() 是使用HashMap的iter方法,傳回一個迭代器,該迭代器可以用於遍歷HashMap中的鍵值對。
  • collect方法,作用是將迭代器中的元素收集到一個容器中,這裡是將鍵值對收集到了score_vec向量中。

然後現在score_vec向量包含了HashMap中的鍵值對,然後使用sort_by方法來排序向量中的元素。其實就是透過一個閉包完成的,該閉包接受兩個參數a和b,它們分別代表向量中的兩個元素,每個元素都是包含鍵和值的元組。

元素比較使用cmp方法,它傳回一個排序順序,對於整數的話,它可以是Ordering::Less、Ordering::Equal或Ordering::Greater,分別表示「小於」、「等於」或「大於」這樣比較。

最後

總結, Rust 中的HashMap是一個強大的資料結構,用於儲存和操作鍵值對。今天主要介紹常規用法、常見操作和一些技巧,希望對你有幫助。