
Design Twitter
Design a simplified version of Twitter where users can post tweets, follow/unfollow another user and is able to see the 10 most recent tweets in the user’s news feed. Your design should support the following methods:
- postTweet(userId, tweetId): Compose a new tweet.
- getNewsFeed(userId): Retrieve the 10 most recent tweet ids in the user’s news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
- follow(followerId, followeeId): Follower follows a followee.
- unfollow(followerId, followeeId): Follower unfollows a followee.
For example:
|
|
| 提示 | 解題應用 |
|---|---|
| HashTable | HashMap |
Default:
|
|
解答思路:
因為曾經在產品開發上實作過類似的東西,所以很快就有了想法,總而言之就是利用兩個hashmap來分別儲存各自的文章與追隨的對象,並記得文章在發送出去之前要包含時間戳記(這邊以發文編號替代),當需要取出個人的動態時報時,就從所有追隨的對象(包含自己)取出文章在依時間戳記做排序,最後只要取出最新的前十篇文章做回傳即可。
程式碼解說:
因為最後要在個人的動態時顯示最新的前十篇文章(包含有追隨對象的文章),因此需要將每則tweet依時間戳記(這邊以發文編號替代)做排序,這邊就自行定義了tweet的結構陣列所要排序的規則
|
|
接著Twitter的結構則是要包含兩個hashmap來分別儲存各自的文章與追隨的對象,與一個計數器以作為每篇文章發表的時間戳記,並在建構函數上初始化分配這三個變數的儲存空間
|
|
當需要發表文章的時候記得先將Twitter物件的計數器+1,並將記數器的值連同tweetId作為tweet一起儲存到自己id在hashmap所對應到的陣列之中
|
|
如思路所述當需要取出個人的動態時報時,就先從所有追隨的對象(包含自己)取出文章,這邊是先取出自己的文章,才將追隨對象的文章放在後頭再依時間戳記做排序,最後只要取出最新的前十篇文章的的TweetId放到結果陣列做回傳即可
|
|
如果想要追隨特定的對象,要先過濾掉自己追隨自己的情況,接著檢查自己已追隨的名單,確定此人是否已經有追隨,如果沒有追隨才將其加入自己的追隨清單之中
|
|
而如果不想要再追隨特定的對象,就從自己已追隨名單中找出對象的index位置,接著在重新組合追隨清單的陣列即可(跳過該元素)
|
|
完整程式碼:
|
|
總結:
要簡單實作twitter所包含的功能(發表文章、追隨陌生人並使其文章出現在自己的動態時報上),做法就是利用兩個hashmap來分別儲存各自的文章與追隨的對象,並記得文章在發送出去之前要包含時間戳記(這邊以發文編號替代),當需要取出個人的動態時報時,就從所有追隨的對象(包含自己)取出文章在依時間戳記做排序,最後只要取出最新的前十篇文章做回傳即可。