employee[“A”].clone().pop() ではなく、要素を指定せずにvalueをpop()したい場合
use std::collections::HashMap; fn main() { let mut employee: HashMap<String, Vec<String>> = HashMap::new(); employee.insert("A".to_string(), vec!["X".to_string(), "Y".to_string(), "Z".to_string()]); employee.insert("B".to_string(), vec!["X".to_string(), "Y".to_string(), "Z".to_string()]); for (key, mut value) in employee { println!("{:?}", value.pop()); } }
for e in employee ってしてしまうと、eからvalueの取り出し方法がわからなくなる。
これに結構時間かかりました。
vectorの要素のindexを取得する方法
println!("{:?}", value.iter().position(|n| n == "Y"));
use std::collections::HashMap; fn main() { let mut employee: HashMap<String, Vec<String>> = HashMap::new(); employee.insert("A".to_string(), vec!["X".to_string(), "Y".to_string(), "Z".to_string()]); employee.insert("B".to_string(), vec!["X".to_string(), "Y".to_string(), "Z".to_string()]); employee.insert("C".to_string(), vec!["Y".to_string(), "Z".to_string(), "X".to_string()]); let mut department: HashMap<String, Vec<String>> = HashMap::new(); department.insert("X".to_string(), vec!["C".to_string(), "A".to_string(), "B".to_string()]); department.insert("Y".to_string(), vec!["B".to_string(), "C".to_string(), "A".to_string()]); department.insert("Z".to_string(), vec!["A".to_string(), "B".to_string(), "C".to_string()]); let res = stable_match(employee, department); println!("{:?}", res); } fn stable_match(request_dict: HashMap<String, Vec<String>>, accept_dict: HashMap<String, Vec<String>>) -> HashMap<String, String>{ let mut match_dict: HashMap<String, String> = HashMap::new(); let req_len = request_dict.len(); while match_dict.len() < req_len { 'label: for (req_name, req_value) in &request_dict { for value in match_dict.values() { if value == req_name { break 'label; } } let acc_name = req_value.pop(); if !match_dict.contains_key(&acc_name) { match_dict.insert(acc_name.unwrap(), req_name.to_string()); } else { let rival_name = match_dict[&acc_name]; if accept_dict[&acc_name].iter().position(|n| n == req_name) < accept_dict[&acc_name].iter().position(|n| n == rival_name) { match_dict.insert(acc_name.unwrap(), req_name.to_string()); } } } } return match_dict; }
うーむ、上手く書けん…