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;
}
うーむ、上手く書けん…