rustgym 0.2.0

rustgym solutions
Documentation
extern crate rand;
use rand::prelude::*;
use std::collections::HashMap;

#[derive(Default)]
struct RandomizedSet {
    rng: ThreadRng,
    indexes: HashMap<i32, usize>,
    values: Vec<i32>,
}

impl RandomizedSet {
    fn new() -> Self {
        RandomizedSet {
            rng: rand::thread_rng(),
            indexes: HashMap::new(),
            values: vec![],
        }
    }
    fn insert(&mut self, val: i32) -> bool {
        if self.indexes.get(&val).is_some() {
            false
        } else {
            self.indexes.insert(val, self.values.len());
            self.values.push(val);
            true
        }
    }
    fn remove(&mut self, val: i32) -> bool {
        if let Some(index) = self.indexes.remove(&val) {
            let last_index = self.values.len() - 1;
            let last_value = self.values[last_index];
            if index != last_index {
                self.values.swap(index, last_index);
                let old_index = self.indexes.get_mut(&last_value).unwrap();
                *old_index = index;
            }
            self.values.pop();
            true
        } else {
            false
        }
    }

    fn get_random(&mut self) -> i32 {
        let index = self.rng.gen_range(0, self.values.len()) as usize;
        self.values[index]
    }
}

#[test]
fn test() {
    let mut obj = RandomizedSet::new();
    assert_eq!(obj.insert(1), true);
    assert_eq!(obj.remove(2), false);
    assert_eq!(obj.insert(2), true);
    assert_eq!(obj.remove(1), true);
    assert_eq!(obj.insert(2), false);
}