设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近 10 条推文。
实现 Twitter 类:
Twitter()初始化简易版推特对象void postTweet(int userId, int tweetId)根据给定的tweetId和userId创建一条新推文。每次调用此函数都会使用一个不同的tweetId。List getNewsFeed(int userId)检索当前用户新闻推送中最近10条推文的 ID 。新闻推送中的每一项都必须是由用户关注的人或者是用户自己发布的推文。推文必须 按照时间顺序由最近到最远排序 。void follow(int followerId, int followeeId)ID 为followerId的用户开始关注 ID 为followeeId的用户。void unfollow(int followerId, int followeeId)ID 为followerId的用户不再关注 ID 为followeeId的用户。
示例:
输入
["Twitter", "postTweet", "getNewsFeed", "follow", "postTweet", "getNewsFeed", "unfollow", "getNewsFeed"]
[[], [1, 5], [1], [1, 2], [2, 6], [1], [1, 2], [1]]
输出
[null, null, [5], null, null, [6, 5], null, [5]]
解释
Twitter twitter = new Twitter();
twitter.postTweet(1, 5); // 用户 1 发送了一条新推文 (用户 id = 1, 推文 id = 5)
twitter.getNewsFeed(1); // 用户 1 的获取推文应当返回一个列表,其中包含一个 id 为 5 的推文
twitter.follow(1, 2); // 用户 1 关注了用户 2
twitter.postTweet(2, 6); // 用户 2 发送了一个新推文 (推文 id = 6)
twitter.getNewsFeed(1); // 用户 1 的获取推文应当返回一个列表,其中包含两个推文,id 分别为 -> [6, 5] 。推文 id 6 应当在推文 id 5 之前,因为它是在 5 之后发送的
twitter.unfollow(1, 2); // 用户 1 取消关注了用户 2
twitter.getNewsFeed(1); // 用户 1 获取推文应当返回一个列表,其中包含一个 id 为 5 的推文。因为用户 1 已经不再关注用户 2
提示:
1 <= userId, followerId, followeeId <= 5000 <= tweetId <= 104- 所有推特的 ID 都互不相同
postTweet、getNewsFeed、follow和unfollow方法最多调用3 * 104次
import java.util.stream.Collectors;
//leetcode submit region begin(Prohibit modification and deletion)
class Twitter {
private Map<Integer, List<TweetMsg>> msgMap;
private Map<Integer, Set<Integer>> followMap;
private int time = 0;
public Twitter() {
this.msgMap = new HashMap<>();
this.followMap = new HashMap<>();
}
public void postTweet(int userId, int tweetId) {
TweetMsg tweetMsg = new TweetMsg();
tweetMsg.userId = userId;
tweetMsg.tweetId = tweetId;
tweetMsg.time = time;
this.time++;
msgMap.putIfAbsent(userId, new ArrayList<>());
msgMap.get(userId).add(tweetMsg);
}
public List<Integer> getNewsFeed(int userId) {
List<TweetMsg> msgList = new ArrayList<>();
if (msgMap.containsKey(userId)) {
msgList.addAll(msgMap.get(userId));
}
if (followMap.containsKey(userId)) {
for (Integer followeeId : followMap.get(userId)) {
if (msgMap.containsKey(followeeId)) {
msgList.addAll(msgMap.get(followeeId));
}
}
}
List<Integer> reultLst = msgList.stream().sorted(new Comparator<>() {
@Override
public int compare(TweetMsg m1, TweetMsg m2) {
return m2.time - m1.time;
}
}).map(p->p.tweetId).collect(Collectors.toList());
if (reultLst.size() > 10) {
return reultLst.subList(0, 10);
} else {
return reultLst;
}
}
public void follow(int followerId, int followeeId) {
followMap.putIfAbsent(followerId, new HashSet<>());
followMap.get(followerId).add(followeeId);
}
public void unfollow(int followerId, int followeeId) {
if (followMap.containsKey(followerId) && followMap.get(followerId).contains(followeeId)) {
followMap.get(followerId).remove(new Integer(followeeId));
}
}
class TweetMsg {
int userId;
int tweetId;
int time;
}
}
/**
* Your Twitter object will be instantiated and called as such:
* Twitter obj = new Twitter();
* obj.postTweet(userId,tweetId);
* List<Integer> param_2 = obj.getNewsFeed(userId);
* obj.follow(followerId,followeeId);
* obj.unfollow(followerId,followeeId);
*/
//leetcode submit region end(Prohibit modification and deletion)