2022/04/23
はじめに
TinyURL のような短縮 URL のシステムをデザインする問題.
今回,Rust を使ってシンプルな解答を作ってみました.特に,『短縮』という点にはこだわらず,要件を満たせるような実装に挑戦してみます.
コード全文
main.rs
struct Codec {
urls: Vec<String>,
}
impl Codec {
fn new() -> Self {
Self { urls: vec![] }
}
fn encode(&mut self, longURL: String) -> String {
self.urls.push(longURL);
(self.urls.len() - 1).to_string()
}
fn decode(&self, shortURL: String) -> String {
let n = shortURL.parse::<usize>().unwrap();
self.urls[n].clone()
}
}
解説
struct 準備
生成した短縮 URL を記録するurls
を準備する.
ここでは,/0
ではurls[0]
を,/1
ではurls[1]
を割り当てられるものとする.
struct Codec {
urls: Vec<String>,
}
struct の実装部
urls
の初期化もココで行う.
impl Codec {
fn new() -> Self {
Self { urls: vec![] }
}
encode()
入力された文字列をurls
の末尾に追加し,追加された位置のインデックス番号を文字列として返す.
fn encode(&mut self, longURL: String) -> String {
self.urls.push(longURL);
(self.urls.len() - 1).to_string()
}
decode()
受け取ったshortURL
をusize
型にパースし,そのインデックスに登録されている URL をurls
から取り出し,それを返す.
fn decode(&self, shortURL: String) -> String {
let n = shortURL.parse::<usize>().unwrap();
self.urls[n].clone()
}
}
おわりに
struct 内の配列からstd::string::String
を返す時に.clone()
が必要なのが,難しかった.
今回の実装では,短縮 URL は数値のみしか持たず,URL の登録数に対して文字列帳が長くなりやすい.
そこで,本来はa-z
およびA-Z
等も含める形にする必要がある.