From e2bbf92e4cf849042f290d2ecfef82da002e8f37 Mon Sep 17 00:00:00 2001 From: nmlgc Date: Sat, 30 Jun 2018 12:40:50 +0200 Subject: [PATCH] chain_second_seq(): Filter out junk and popular elements in a more idiomatic way --- src/sequencematcher.rs | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/src/sequencematcher.rs b/src/sequencematcher.rs index 5555565..0dc645b 100644 --- a/src/sequencematcher.rs +++ b/src/sequencematcher.rs @@ -1,5 +1,5 @@ use std::cmp::{max, min}; -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use std::fmt::Debug; use utils::calculate_ratio; @@ -159,29 +159,20 @@ impl<'a, T: ?Sized + Sequence> SequenceMatcher<'a, T> { .or_insert(Vec::new()); counter.push(i); } - if self.is_junk.is_some() { - let mut junk = Vec::new(); - for element in second_sequence_elements.keys() { - if (self.is_junk.unwrap())(element) { - junk.push(element.clone()); - } - } - for element in &junk { - second_sequence_elements.remove(element); - } + if let Some(junk_func) = self.is_junk { + second_sequence_elements = second_sequence_elements + .into_iter() + .filter(|&(element, _)| !junk_func(element)) + .collect(); } - let mut popular = HashSet::new(); + // Filter out popular elements let len = second_sequence.len(); if len >= 200 { let test_len = (len as f32 / 100.0).floor() as usize + 1; - for (element, indexes) in second_sequence_elements.iter() { - if indexes.len() > test_len { - popular.insert(element.clone()); - } - } - for element in &popular { - second_sequence_elements.remove(element); - } + second_sequence_elements = second_sequence_elements + .into_iter() + .filter(|&(_, ref indexes)| indexes.len() > test_len) + .collect(); } self.second_sequence_elements = second_sequence_elements; }