chain_second_seq(): Filter out junk and popular elements in a more idiomatic way

This commit is contained in:
nmlgc
2018-06-30 12:40:50 +02:00
parent 63e214364a
commit e2bbf92e4c
+11 -20
View File
@@ -1,5 +1,5 @@
use std::cmp::{max, min}; use std::cmp::{max, min};
use std::collections::{HashMap, HashSet}; use std::collections::HashMap;
use std::fmt::Debug; use std::fmt::Debug;
use utils::calculate_ratio; use utils::calculate_ratio;
@@ -159,29 +159,20 @@ impl<'a, T: ?Sized + Sequence> SequenceMatcher<'a, T> {
.or_insert(Vec::new()); .or_insert(Vec::new());
counter.push(i); counter.push(i);
} }
if self.is_junk.is_some() { if let Some(junk_func) = self.is_junk {
let mut junk = Vec::new(); second_sequence_elements = second_sequence_elements
for element in second_sequence_elements.keys() { .into_iter()
if (self.is_junk.unwrap())(element) { .filter(|&(element, _)| !junk_func(element))
junk.push(element.clone()); .collect();
}
}
for element in &junk {
second_sequence_elements.remove(element);
}
} }
let mut popular = HashSet::new(); // Filter out popular elements
let len = second_sequence.len(); let len = second_sequence.len();
if len >= 200 { if len >= 200 {
let test_len = (len as f32 / 100.0).floor() as usize + 1; let test_len = (len as f32 / 100.0).floor() as usize + 1;
for (element, indexes) in second_sequence_elements.iter() { second_sequence_elements = second_sequence_elements
if indexes.len() > test_len { .into_iter()
popular.insert(element.clone()); .filter(|&(_, ref indexes)| indexes.len() > test_len)
} .collect();
}
for element in &popular {
second_sequence_elements.remove(element);
}
} }
self.second_sequence_elements = second_sequence_elements; self.second_sequence_elements = second_sequence_elements;
} }