partⅣ Tweet Tweet

这个实验写起来很麻烦,首先理解题意就有些困难,因为没用过twitter,对于有些概念,如timestamp,getmention不知道什么意思,花了很长时间来理解。按照做实验的顺序回顾一下这个系列。

首先是实现Extract类,这个类是实现从twitter列表中获取信息的方法。

先来看一下Tweet类的内容,

private final long id;
private final String author;
private final String text;
private final Instant timestamp;

id是账户名,author就是写推文的作者,text是推文的内容,timestamp就是发推文的时间。

Timespan类的属性

private final Instant start;
private final Instant end;

就是两个时间点一个开始,一个结束。

getTimespan函数就是从一个tweet列表里找一个区间,包括所有发推时间。

/*** Get the time period spanned by tweets.* * @param tweets*            list of tweets with distinct ids, not modified by this method.* @return a minimum-length time interval that contains the timestamp of every*         tweet in the list.*/public static Timespan getTimespan(List<Tweet> tweets) {int n = tweets.size();Instant min = tweets.get(0).getTimestamp();Instant max = tweets.get(0).getTimestamp();for (int i = 1; i < n; i++) {Instant now = tweets.get(i).getTimestamp();if (now.isBefore(min))min = now;if (now.isAfter(max))max = now;}Timespan timespan = new Timespan(min, max);return timespan;}

理解函数的功能就很容易实现它。

/*** Get usernames mentioned in a list of tweets.* * @param tweets*            list of tweets with distinct ids, not modified by this method.* @return the set of usernames who are mentioned in the text of the tweets. A*         username-mention is "@" followed by a Twitter username (as defined by*         Tweet.getAuthor()'s spec). The username-mention cannot be immediately*         preceded or followed by any character valid in a Twitter username.*         For this reason, an email address like bitdiddle@mit.edu does NOT*         contain a mention of the username mit. Twitter usernames are*         case-insensitive, and the returned set may include a username at most*         once.*/public static Set<String> getMentionedUsers(List<Tweet> tweets) {Set<String> usernameInText = new HashSet<String>();int n = tweets.size();Pattern pattern = Pattern.compile("(^|[^A-Za-z0-9_-]+)@([A-Za-z0-9_-]+)");//满足条件的字符字串的正则表达式for (int i = 0; i < n; i++) {String text = tweets.get(i).getText();Matcher username_mention = pattern.matcher(text);while (username_mention.find()) {String now = new String(username_mention.group(2).toString().toLowerCase());//全用小写。usernameInText.add(now);//将匹配到的username都添加到usernameInText}}return usernameInText;}

该函数是从所有推文中找到所有被@的用户名,根据要求构造出一个正则表达式来对字符串进行匹配,usernameInText是Set不用考虑重复的问题,但是要考虑大小写,所以在添加之前我都转化成小写了。

接下来是Filter类,这个类实现对推特列表进行分类,根据时间,作者,推文内容等分类。这几个函数都很好写,writtenBy就遍历每篇推文的作者,inTimespan就遍历时间,containing要遍历推文内容,要忽略大小写。

SocialNetwork类不是很好写,这个类是要根据推文内容推测用户之间的关系,我采用了最简单的方法,即如果A的 推文中@了B,那么就认为A认识B。最终想要得到Map<String, Set<String>>的结构,即每个人映射一个他@过的所有人。用之前实现的函数writtenBy和getMentionedUsers可以很容易得到。

 public static Map<String, Set<String>> guessFollowsGraph(List<Tweet> tweets) {Map<String, Set<String>> followMap = new HashMap<String, Set<String>>();Set<String> author = new HashSet<String>();int n = tweets.size();for (int i = 0; i < n; i++) {Tweet now = tweets.get(i);author.add(now.getAuthor().toLowerCase());}for (String str : author) {List<Tweet> fromStr = Filter.writtenBy(tweets, str);Set<String> usernameInText = Extract.getMentionedUsers(fromStr);followMap.put(str, usernameInText);}return followMap;}

首先把所有推特遍历一遍,找到所有作者,构成一个集合,然后遍历这个集合。对于每个user,先用writtenBy找到他写的文章,然后用getMentionedUsers得到他@的人。

然后是一个测试,要你根据给出的推特(很多),找出谁被最多的人@过(who have the greatest influence)。用Map<String, Integer>这样的映射记录每个人和他的influence值。得到这个映射之后就进行排序,我选择了插入排序,边生成边排序。

public static List<String> influencers(Map<String, Set<String>> followsGraph) {Map<String, Integer> influenceMap = new HashMap();List<String> influencers = new LinkedList();Set<String> authors = followsGraph.keySet();for (String author : authors) {for (String user : followsGraph.get(author)) {if (!influenceMap.containsKey(user))influenceMap.put(user, 1);elseinfluenceMap.put(user, influenceMap.get(user) + 1);}}Set<String> users = influenceMap.keySet();for (String user : users) {int i = 0;while (i < influencers.size() && influenceMap.get(user) < influenceMap.get(influencers.get(i))) {i++;}influencers.add(i, user);}return influencers;}

lab1 partⅣ相关推荐

  1. ucore操作系统实验笔记 - Lab1

    最近一直都在跟清华大学的操作系统课程,这个课程最大的特点是有一系列可以实战的操作系统实验.这些实验总共有8个,我在这里记录实验中的一些心得和总结. Task1 这个Task主要是为了熟悉Makfile ...

  2. [ST2017] Lab1: Triangle type and Junit test

    Lab1 3014218071 王汉超 Request: Write a program with a function(getTriangleStatus) and test it, which t ...

  3. 6.824 MapReduce lab1 2020(一)

    文章目录 MIT 6.824 分布式系统 lab1:MapReduce Notes wordcount's MapReduce Model look like a simple sequential ...

  4. MIT6.830 lab1 SimpleDb 实验报告

    一.环境搭建 1.课程官网:6.830/6.814: Database Systems 2.Github地址:simple-db-hw-2021 3.安装配置ant 二.实验概览 SimpleDB c ...

  5. EIGRP分解试验部分-LAB1:EIGRP基本试验

    LAB1:EIGRP基本试验 拓扑图: 试验需求: 全网运行EIGRP路由协议,能够实现全网的互通,并且掌握主要几种show 命令的使用. 主要配置命令: R1(config)#router eigr ...

  6. ucore lab1 任务六

    任务六: 1.首先要明白什么是函数调用堆栈(上网查资料) 分析下述代码的堆栈调用 int Add(int x, int y) { return x + y; } void main() { int * ...

  7. MIT 操作系统实验 MIT JOS lab1

    JOS lab1 首先向MIT还有K&R致敬! 没有很好的开源环境我不可能拿到这么好的东西. 向每一个与我一起交流讨论的programmer致谢!没有道友一起死磕,我也可能会中途放弃. 跟丫死 ...

  8. 清华操作系统实验lab1

    第一次写的lab1练习1太冗杂,没有重点,理解不到位,后续进一步研究后感觉务必重新写一篇...... [练习1.1] 操作系统镜像文件 ucore.img 是如何一步一步生成的 生成ucore.img ...

  9. xv6 6.S081 Lab1: util

    xv6 6.S081 Lab1: util 写在前面 实验介绍 开始! sleep pingpong Primes Find Xargs 拖了这么久,终于稍微有时间填坑了.今天介绍xv6的第一个实验u ...

  10. CS144 计算机网络 lab1

    CS144 计算机网络 lab1 上一学期刚学习了计算机网络这门课程,感觉还是挺有意思的,了解到CS144的lab所以便打算利用假期练练手,顺便也尝试着开始写博客.代码风格还很新手,多多包涵,欢迎讨论 ...

最新文章

  1. 路由器snmp配置_基于keepalived配置数据库主从实现高可用
  2. Android 调试工具集合
  3. 从Java 10中删除的API
  4. QPW 提现申请单表(暂时不做)(tf_cash_apply)
  5. MySQL于ON DUPLICATE KEY UPDATE采用
  6. 网址发布页模板,带网址测速+域名检测功能
  7. 设计灵感|浓浓人文感!中文活动海报设计学习案例
  8. 8880 e7 v2配什么主板_MATX主板配什么机箱好?曜越Tt启航者A3装机记
  9. 深度学习3-tensorflow2.0模型训练-自定义模型训练
  10. paip.python错误解决6
  11. 使用计算机键盘的基本步骤,键盘指法练习方法
  12. JAVA办公管理系统(OA)
  13. 计算机信息管理不会电脑,不要抱怨网速慢.只怪你不会调网速★让你的电脑一点都不卡...
  14. python实现multi函数参数个数不限、返回所有参数乘积_实现multi( )函数,参数个数不限,返回所有参数的乘积。_学小易找答案...
  15. 【转】模仿绘画风格的算法:A Neural Algorithm of Artistic Style
  16. 100个世界上鲜为人知的“常识”
  17. RankNet学习思路+损函感悟+\pi \xu 学xi+交叉熵损函详
  18. linux 文件755权限的意思,Linux文件和目录的777、755、644权限解释
  19. 方程组通解的参数向量形式、基本变量和自由变量
  20. Python seek()和tell()函数详解

热门文章

  1. java中bean是什么_java中bean是什么意思?有什么作用 | 学步园
  2. 上汽集团进军网约车市场  滴滴的市场地位会被传统车企们挑战成功吗?
  3. PyCharm和Jupyter使用对比
  4. C fseek() and fteel()
  5. 获取QQ音乐歌曲播放源地址
  6. linux 25端口漏洞,Linux通过栈溢出进行提权实战(dpwwn03)
  7. 华硕飞行堡垒6 U盘安装win10系统步骤:
  8. QPS 与 TPS 简介
  9. cnpm : 无法加载文件 D:\myDEV\newNode\node_global\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com
  10. nodejs中的__filename和__dirname