-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathtweet_counts_per_frequency.rs
More file actions
70 lines (60 loc) · 1.7 KB
/
tweet_counts_per_frequency.rs
File metadata and controls
70 lines (60 loc) · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use std::collections::{BTreeMap, HashMap};
#[derive(Debug)]
struct TweetCounts {
map: HashMap<String, BTreeMap<i32, i32>>,
}
impl TweetCounts {
#[allow(dead_code)]
fn new() -> Self {
Self {
map: HashMap::new(),
}
}
#[allow(dead_code)]
fn record_tweet(&mut self, tweet_name: String, time: i32) {
self.map
.entry(tweet_name)
.or_default()
.entry(time)
.and_modify(|c| *c += 1)
.or_insert(1);
}
#[allow(dead_code, clippy::needless_pass_by_value)]
fn get_tweet_counts_per_frequency(
&self,
freq: String,
tweet_name: String,
start_time: i32,
end_time: i32,
) -> Vec<i32> {
let counts = self.map.get(&tweet_name).unwrap();
let delta = match &freq[..] {
"second" => 1,
"minute" => 60,
"hour" => 3600,
"day" => 86400,
_ => panic!("fail"),
};
let mut res = vec![];
let mut iter = counts.range(start_time..=end_time).peekable();
let mut cur_time = end_time.min(start_time + delta - 1);
while cur_time <= end_time {
let mut total_count = 0;
while let Some((time, count)) = iter.peek() {
if **time <= cur_time {
total_count += **count;
iter.next();
} else {
break;
}
}
res.push(total_count);
if cur_time + delta > end_time && cur_time != end_time {
cur_time = end_time;
} else {
cur_time += delta;
}
}
res
}
}