隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

我的相片
目前從事軟體相關行業,喜歡閱讀、健身、喝調酒。習慣把遇到的問題記下來,每天做一些整理方便自己以後查。 Python、Rust、Kotlin等程式語言皆為自學,目前比較著重在Rust語言,歡迎一起討論。

2023年11月23日 星期四

Rust 切片join概述 - 在每個值中間插值


join,可以在兩個切片中插值

我覺得是一個做題目,或者資料夾操作的時候比較常用到的方法

特別是題目真的不少

後面會舉個例子


join

join被歸類在slice下

文件[1]這樣寫

在每個值中間給定指定符號

    pub fn join<Separator>(&self, sep: Separator) -> <[T] as Join<Separator>>::Output
    where
        [T]: Join<Separator>,

self為切片本身

sep為分隔符號

回傳一個字串String


例子

舉個簡單的例子

    let res = ["Hello", "world", "Rust"];
    println!("{:?}", res.join(" ")); "Hello world Rust"

假設有一個數組分別為["Hello", "world", "Rust"]

可以透過join將其組合成一個數組

成功顯示 Hello world Rust


而join也可以連接數組

    let res = [[1], [2], [3]];
    println!("{:?}", res.join(&0));
[1, 0, 2, 0, 3]

可以將1, 2, 3連接成數組1, 0, 2, 0, 3

也可以連接成字串1, 2, 3

    let nums = [1, 2, 3];
    let res = nums
        .into_iter()
        .map(|s| s.to_string())
        .collect::<Vec<String>>()
        .join(",");
    println!("{:?}", res);

創立一個數組1, 2, 3

透過into_iter[2]丟入迭代器

使用map[3],將每個元素轉成字串

透過collect,將字串值存成數組,也就是成先["1".to_string(), "2".to_string(), "3".to_string()]

最後再透過join連結每個字串


實際例子

我個人覺得

CodeWar的題目真的很多會用到join

如果不太會用join有些題目會蠻麻煩的

我舉一題當作範例[4]

這題是7kyu

不難,可以自己做做看

Complete the function that accepts a string parameter, and reverses each word in the string. All spaces in the string should be retained.

Examples

"This is an example!" ==> "sihT si na !elpmaxe"

"double  spaces"      ==> "elbuod  secaps"

完成一個函數,反轉String中的單字,每個空白鍵要依然留著

fn reverse_words(str: &str) -> String {
    // your code here
    "Test String".to_string()
}

可以用這個做測試

fn sample_test() {
  assert_eq!(reverse_words("The quick brown fox jumps over the lazy dog."), "ehT kciuq nworb xof spmuj revo eht yzal .god");
  assert_eq!(reverse_words("apple"), "elppa");
  assert_eq!(reverse_words("a b c d"),"a b c d");
  assert_eq!(reverse_words("double  spaced  words"), "elbuod  decaps  sdrow");
}




解題思路

預期取出每個單字

並對每個單字做反向才連接


fn reverse_words(str: &str) -> String {
    str.split(" ")
        .into_iter()
        .map(|word| word.chars().rev().collect::<String>())
        .collect::<Vec<_>>()
        .join(" ")
}

先透過split(" ")對空白鍵分割,此時取得每個單字

之後放入數組

透過map將單字反向,使用閉包

將每個單字的字符放入迭代器中並做反向,最後蒐集成String

使用collect::<Vec<_>>將每個String放入數組

最後join以空格連接


參考資料

[1] https://doc.rust-lang.org/std/primitive.slice.html#method.join

[2] https://lageeblog.blogspot.com/2023/10/rust-map.html

[3] https://lageeblog.blogspot.com/2023/10/rust-map.html



0 comments:

張貼留言