|
1 | 1 | class TweetCounts { |
2 | | - private Map<String, TreeSet<Integer>> tweets; |
| 2 | + private Map<String, TreeMap<Integer, Integer>> m; |
3 | 3 |
|
4 | 4 | public TweetCounts() { |
5 | | - tweets = new HashMap<>(); |
| 5 | + m = new HashMap<>(); |
6 | 6 | } |
7 | 7 |
|
8 | 8 | public void recordTweet(String tweetName, int time) { |
9 | | - tweets.putIfAbsent(tweetName, new TreeSet<>()); |
10 | | - tweets.get(tweetName).add(time); |
| 9 | + m.putIfAbsent(tweetName, new TreeMap<>()); |
| 10 | + TreeMap<Integer, Integer> times = m.get(tweetName); |
| 11 | + times.put(time, times.getOrDefault(time, 0) + 1); |
| 12 | + m.put(tweetName, times); |
11 | 13 | } |
12 | 14 |
|
13 | 15 | public List<Integer> getTweetCountsPerFrequency(String freq, String tweetName, int startTime, int endTime) { |
14 | | - List<Integer> result = new ArrayList<>(); |
| 16 | + if (!m.containsKey(tweetName)) { |
| 17 | + Collections.emptyList(); |
| 18 | + } |
15 | 19 |
|
16 | | - int delta = calcDelta(freq); |
| 20 | + List<Integer> result = new ArrayList<>(); |
| 21 | + TreeMap<Integer, Integer> times = m.get(tweetName); |
| 22 | + int delta = calculateDelta(freq); |
17 | 23 | int intervalStart = startTime, intervalEnd = intervalStart + delta; |
18 | | - TreeSet<Integer> times = tweets.get(tweetName); |
19 | 24 |
|
20 | 25 | while (intervalStart <= endTime) { |
21 | | - SortedSet<Integer> timesSubset = times.subSet(intervalStart, Math.min(intervalEnd, endTime + 1)); |
22 | | - int intervalCount = 0; |
| 26 | + // SortedMap<Integer, Integer> timesSubset = times.subMap(intervalStart, Math.min(intervalEnd, endTime + 1)); |
23 | 27 |
|
24 | | - for (int frequency : timesSubset) { |
25 | | - intervalCount += 1; |
| 28 | + int count = 0; |
| 29 | + for (Map.Entry<Integer, Integer> entry : times.subMap(intervalStart, Math.min(intervalEnd, endTime + 1)) |
| 30 | + .entrySet()) { |
| 31 | + count += entry.getValue(); |
26 | 32 | } |
27 | 33 |
|
28 | | - result.add(intervalCount); |
29 | | - |
30 | | - intervalStart = intervalEnd; |
31 | | - intervalEnd = intervalStart + delta; |
| 34 | + result.add(count); |
| 35 | + intervalStart += delta; |
| 36 | + intervalEnd += delta; |
32 | 37 | } |
33 | 38 |
|
34 | 39 | return result; |
35 | 40 | } |
36 | 41 |
|
37 | | - private int calcDelta(String freq) { |
| 42 | + private int calculateDelta(String freq) { |
38 | 43 | if (freq.equals("minute")) { |
39 | 44 | return 60; |
40 | 45 | } else if (freq.equals("hour")) { |
|
0 commit comments