|
1 | 1 | import java.util.*; |
2 | | -import java.util.concurrent.*; |
3 | 2 |
|
4 | 3 | public class TT1 { |
5 | | - private Map<String, TreeSet<Long>> tweets; |
| 4 | + enum Frequency { |
| 5 | + MINUTE, HOUR, DAY |
| 6 | + } |
| 7 | + |
| 8 | + private Map<String, TreeMap<Long, Integer>> tweets; |
6 | 9 |
|
7 | 10 | public TT1() { |
8 | 11 | tweets = new HashMap<>(); |
9 | 12 | } |
10 | 13 |
|
11 | 14 | public void recordTweet(String tweetName, long time) { |
12 | | - tweets.putIfAbsent(tweetName, new TreeSet<>()); |
13 | | - tweets.get(tweetName).add(time); |
| 15 | + tweets.putIfAbsent(tweetName, new TreeMap<>()); |
| 16 | + TreeMap<Long, Integer> times = tweets.get(tweetName); |
| 17 | + times.put(time, times.getOrDefault(time, 0) + 1); |
14 | 18 | } |
15 | 19 |
|
16 | 20 | public long[] getTweetCountsPerFrequency(Frequency freq, String tweetName, long startTime, long endTime) { |
17 | | - if (!tweets.containsKey(tweetName)) { |
18 | | - return new long[0]; |
19 | | - } |
| 21 | + TreeMap<Long, Integer> times = tweets.get(tweetName); |
20 | 22 |
|
21 | | - TreeSet<Long> tweetTimes = tweets.get(tweetName); |
| 23 | + long diff = endTime - startTime; |
| 24 | + long delta = getDelta(freq); |
| 25 | + long[] result = new long[(int) (diff / delta) + 1]; |
22 | 26 |
|
23 | | - long timePeriod = endTime - startTime; |
24 | | - long delta = getDelta(freq, timePeriod); |
25 | | - long[] result = new long[(int) delta + 1]; |
26 | | - long intervalStart = startTime, intervalEnd = intervalStart + delta; |
| 27 | + long startInterval = startTime, endInterval = startInterval + delta; |
27 | 28 | int idx = 0; |
28 | 29 |
|
29 | | - while (intervalStart <= endTime) { |
30 | | - SortedSet<Long> timesSubset = tweetTimes.subSet(intervalStart, Math.min(intervalEnd, endTime + 1)); |
31 | | - result[idx] = timesSubset.size(); |
| 30 | + while (startInterval <= endTime) { |
| 31 | + SortedMap<Long, Integer> subMap = times.subMap(startInterval, Math.min(endInterval, endTime + 1)); |
| 32 | + long count = 0; |
| 33 | + |
| 34 | + for (long time : subMap.keySet()) { |
| 35 | + count += subMap.get(time); |
| 36 | + } |
| 37 | + |
| 38 | + result[idx] = count; |
32 | 39 | ++idx; |
| 40 | + |
| 41 | + startInterval += delta; |
| 42 | + endInterval += delta; |
33 | 43 | } |
34 | 44 |
|
35 | 45 | return result; |
36 | 46 | } |
37 | 47 |
|
38 | | - private long getDelta(Frequency f, long timePeriod) { |
39 | | - TimeUnit tu = TimeUnit.MILLISECONDS; |
40 | | - |
41 | | - if (f.equals(Frequency.MINUTE)) { |
42 | | - return tu.toSeconds(timePeriod); |
43 | | - } else if (f.equals(Frequency.HOUR)) { |
44 | | - return tu.toHours(timePeriod); |
| 48 | + private long getDelta(Frequency f) { |
| 49 | + if (Frequency.MINUTE == f) { |
| 50 | + return 60 * 1000; |
| 51 | + } else if (Frequency.HOUR == f) { |
| 52 | + return 60 * 60 * 1000; |
| 53 | + } else if (Frequency.DAY == f) { |
| 54 | + return 60 * 60 * 24 * 1000; |
45 | 55 | } else { |
46 | | - return tu.toDays(timePeriod); |
| 56 | + return 0L; |
47 | 57 | } |
48 | 58 | } |
49 | 59 |
|
50 | | - enum Frequency { |
51 | | - MINUTE, HOUR, DAY |
52 | | - } |
| 60 | + public static void main(String[] args) { |
| 61 | + TT1 tweetCounts = new TT1(); |
53 | 62 |
|
54 | | - /* |
55 | | - * Generate some random timestamps |
56 | | - */ |
57 | | - public static class TimeMachine { |
58 | | - public static long between(Date startInclusive, Date endExclusive) { |
59 | | - long startMillis = startInclusive.getTime(); |
60 | | - long endMillis = endExclusive.getTime(); |
61 | | - long randomMillisSinceEpoch = ThreadLocalRandom.current().nextLong(startMillis, endMillis); |
62 | | - return randomMillisSinceEpoch; |
63 | | - } |
64 | | - } |
| 63 | + tweetCounts.recordTweet("tweet3", 0); |
| 64 | + tweetCounts.recordTweet("tweet3", 60000); |
| 65 | + tweetCounts.recordTweet("tweet3", 10000); |
| 66 | + tweetCounts.recordTweet("tweet3", 10000); |
65 | 67 |
|
66 | | - public static void main(String[] args) { |
67 | | - long now = new Date().getTime(); |
68 | | - Date tenDaysAgo = new Date(now - TimeUnit.DAYS.toMillis(10)); |
69 | | - Date tenMinsAgo = new Date(now - TimeUnit.MINUTES.toMillis(10)); |
70 | | - Date oneMinAgo = new Date(now - TimeUnit.MINUTES.toMillis(1)); |
71 | | - Date tenHoursAgo = new Date(now - TimeUnit.HOURS.toMillis(10)); |
72 | | - |
73 | | - TT1 tc = new TT1(); |
74 | | - Date rightnow = new Date(now); |
75 | | - |
76 | | - for (int i = 0; i < 1000; i++) { |
77 | | - long randomTime = TimeMachine.between(tenDaysAgo, rightnow); |
78 | | - tc.recordTweet("tweet", randomTime); |
79 | | - } |
| 68 | + System.out |
| 69 | + .println(Arrays.toString(tweetCounts.getTweetCountsPerFrequency(Frequency.MINUTE, "tweet3", 0, 59000))); |
| 70 | + System.out |
| 71 | + .println(Arrays.toString(tweetCounts.getTweetCountsPerFrequency(Frequency.MINUTE, "tweet3", 0, 60000))); |
| 72 | + |
| 73 | + tweetCounts.recordTweet("tweet3", 120000); |
80 | 74 |
|
81 | | - System.out.println(Arrays.toString( |
82 | | - tc.getTweetCountsPerFrequency(Frequency.MINUTE, "tweet", oneMinAgo.getTime(), rightnow.getTime()))); |
83 | | - System.out.println(Arrays.toString( |
84 | | - tc.getTweetCountsPerFrequency(Frequency.MINUTE, "tweet", tenMinsAgo.getTime(), rightnow.getTime()))); |
85 | | - System.out.println(Arrays.toString( |
86 | | - tc.getTweetCountsPerFrequency(Frequency.HOUR, "tweet", tenMinsAgo.getTime(), rightnow.getTime()))); |
87 | | - System.out.println(Arrays.toString( |
88 | | - tc.getTweetCountsPerFrequency(Frequency.HOUR, "tweet", tenHoursAgo.getTime(), rightnow.getTime()))); |
89 | | - System.out.println(Arrays.toString( |
90 | | - tc.getTweetCountsPerFrequency(Frequency.DAY, "tweet", tenDaysAgo.getTime(), rightnow.getTime()))); |
| 75 | + System.out |
| 76 | + .println(Arrays.toString(tweetCounts.getTweetCountsPerFrequency(Frequency.HOUR, "tweet3", 0, 210000))); |
91 | 77 |
|
92 | 78 | return; |
93 | 79 | } |
|
0 commit comments