题意:设计出一个简单的twitter,能够发布feed,关注用户,取消关注用户及获取用户最近关注的10个feed
思路:用map来记录用户所关注的用户,另外一个map来记录用户所发布的feed。在获取用户最近关注的10个feed,先获取用户所关注的用户,然后再看所关注的用户所发布的feed,在求的过程中使用优先级队列并且使用stream和lamba表达式
代码如下:
public class Twitter {
class twitter
{
int id;
int time;
twitter(int id, int time)
{
this.id = id;
this.time = time;
}
}
private Map<Integer, Set<Integer>> fans;
private Map<Integer, List<twitter>> twitters;
private int count = 0;
/** Initialize your data structure here. */
public Twitter()
{
fans = new HashMap<>();
twitters = new HashMap<>();
}
/** Compose a new tweet. */
public void postTweet(int userId, int tweetId)
{
if (!fans.containsKey(userId)) fans.put(userId, new HashSet<>());
fans.get(userId).add(userId);
if (!twitters.containsKey(userId)) twitters.put(userId, new ArrayList<>());
twitters.get(userId).add(new twitter(tweetId, count++));
}
/** 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. */
public List<Integer> getNewsFeed(int userId)
{
if (!fans.containsKey(userId)) return new ArrayList<>();
Queue<twitter> queue = new PriorityQueue<>((t1, t2)-> t2.time - t1.time);
fans.get(userId).stream().filter(f->twitters.containsKey(f)).forEach(f->twitters.get(f).forEach(queue::add));
List<Integer> ans = new ArrayList<>();
while (!queue.isEmpty() && ans.size() < 10)
{
ans.add(queue.poll().id);
}
return ans;
}
/** Follower follows a followee. If the operation is invalid, it should be a no-op. */
public void follow(int followerId, int followeeId)
{
if (!fans.containsKey(followerId)) fans.put(followerId, new HashSet<>());
fans.get(followerId).add(followeeId);
}
/** Follower unfollows a followee. If the operation is invalid, it should be a no-op. */
public void unfollow(int followerId, int followeeId)
{
if (!fans.containsKey(followerId)) fans.put(followerId, new HashSet<>());
if (followerId == followeeId) return;
fans.get(followerId).remove(followeeId);
}
}