2017-06-15 4 views
2

複数のエントリを一度にHashMapに挿入する方法はありますか?または複数のエントリで初期化する?挿入しているすべての要素に手動でinsertを呼び出す以外のものはありますか?複数のエントリを一度にHashMapに挿入する方法はありますか?

let frequencies = { 
    'a': 0.08167, 
    'b': 0.01492, 
    ... 
    'z': 0.00074 
} 

は私が次のようなforループを実行して同じ結果を得ることができます知っているが、私が欲しい:

が、私は基本的にしたい:英語の手紙の周波数を使用して例えば

編集追加の配列を作成せずにループしたり、一般的にはより洗練された解決法を使用しないでこれを行う方法があるかどうかを知ることができます。リテラルの場合

let mut frequencies = HashMap::new(); 
let letters = ['a','b','c', ...... 'z']; 
let freqs = [0.08167, 0.01492, 0.02782, ......., 0.00074]; 
for i in 0..26 { 
    frequencies.insert(letters[i], freqs[i]); 
} 

、私はおそらくこの例では正常に動作します答え hereを、使用することができますが、これが立ち上がる場合には、私は、それがリテラルをせずにこれを行う方法があるのか​​どうか好奇心将来は。

+1

可能な複製(します。https:// stackoverflowのそれらのすべてが同じマップを生成し、次の例を考えてみましょう.com/questions/27582739/how-do-i-create-a-hashmap-literal) – JAL

+4

あなたはこれを望む理由を説明できますか?何度も "挿入"するのを避けようとしていますか? (もしそうなら、ハッシュマップリテラルマクロクレートがあります)。ハッシュマップのサイズ変更を避けようとしていますか? (もしそうなら、それを 'with_capacity'で初期化することができます)ランタイムを通る往復を避けようとしていますか? (もしそうなら、私はそれを心配しないように言いますが、それはPythonやJavaScriptのように実際には存在しません。)2つのハッシュマップをマージするために必要なコードを短くしようとしていますか? ? –

+0

* 1つの要素ごとに手動でinsertを呼び出す以外* *可能です。ループを使用して、手動で 'insert 'を1回だけ呼び出すことができます。 – Shepmaster

答えて

8

複数のエントリを一度にHashMapに挿入する方法はありますか?

はい、あなたはこのように、Iteratorからの値でHashMapextendことができます。extendがで提供サイズのヒントを使用しているため、

use std::collections::HashMap; 

fn main() { 
    let mut map = HashMap::new(); 
    map.extend((1..3).map(|n| (format!("{}*2=", n), n * 2))); 
    map.extend((7..9).map(|n| (format!("{}*2=", n), n * 2))); 
    println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}. 
} 

それは、少し速く手動insertを呼び出すよりも、ありますIteratorに事前にスペースを確保してください。

メソッドhere, in map.rsのソースコードを確認してください。

複数のエントリで初期化するにはどうすればよいですか?

FromIterator形質を実装するHashMapのおかげでこれも可能です。コレクションにFromIteratorが実装されている場合は、Iterator::collectの省略形を使用してコレクションを構築できます。

use std::collections::HashMap; 

fn main() { 
    let mut map: HashMap<_, _> = (1..3).map(|n| (format!("{}*2=", n), n * 2)).collect(); 
    map.extend((7..9).map(|n| (format!("{}*2=", n), n * 2))); 
    println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}. 
} 

use std::collections::HashMap; 

fn main() { 
    let map: HashMap<_, _> = (1..3) 
     .chain(7..9) 
     .map(|n| (format!("{}*2=", n), n * 2)) 
     .collect(); 
    println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}. 
} 

use std::collections::HashMap; 
use std::iter::FromIterator; 

fn main() { 
    let iter = (1..3).chain(7..9).map(|n| (format!("{}*2=", n), n * 2)); 
    let map = HashMap::<String, u32>::from_iter(iter); 
    println!("{:?}", map); // Prints {"1*2=": 2, "8*2=": 16, "7*2=": 14, "2*2=": 4}. 
} 
[私は文字通りのHashMapを作成するにはどうすればよい?]の
関連する問題