lab1 partⅣ
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Ⅳ相关推荐
- ucore操作系统实验笔记 - Lab1
最近一直都在跟清华大学的操作系统课程,这个课程最大的特点是有一系列可以实战的操作系统实验.这些实验总共有8个,我在这里记录实验中的一些心得和总结. Task1 这个Task主要是为了熟悉Makfile ...
- [ST2017] Lab1: Triangle type and Junit test
Lab1 3014218071 王汉超 Request: Write a program with a function(getTriangleStatus) and test it, which t ...
- 6.824 MapReduce lab1 2020(一)
文章目录 MIT 6.824 分布式系统 lab1:MapReduce Notes wordcount's MapReduce Model look like a simple sequential ...
- MIT6.830 lab1 SimpleDb 实验报告
一.环境搭建 1.课程官网:6.830/6.814: Database Systems 2.Github地址:simple-db-hw-2021 3.安装配置ant 二.实验概览 SimpleDB c ...
- EIGRP分解试验部分-LAB1:EIGRP基本试验
LAB1:EIGRP基本试验 拓扑图: 试验需求: 全网运行EIGRP路由协议,能够实现全网的互通,并且掌握主要几种show 命令的使用. 主要配置命令: R1(config)#router eigr ...
- ucore lab1 任务六
任务六: 1.首先要明白什么是函数调用堆栈(上网查资料) 分析下述代码的堆栈调用 int Add(int x, int y) { return x + y; } void main() { int * ...
- MIT 操作系统实验 MIT JOS lab1
JOS lab1 首先向MIT还有K&R致敬! 没有很好的开源环境我不可能拿到这么好的东西. 向每一个与我一起交流讨论的programmer致谢!没有道友一起死磕,我也可能会中途放弃. 跟丫死 ...
- 清华操作系统实验lab1
第一次写的lab1练习1太冗杂,没有重点,理解不到位,后续进一步研究后感觉务必重新写一篇...... [练习1.1] 操作系统镜像文件 ucore.img 是如何一步一步生成的 生成ucore.img ...
- xv6 6.S081 Lab1: util
xv6 6.S081 Lab1: util 写在前面 实验介绍 开始! sleep pingpong Primes Find Xargs 拖了这么久,终于稍微有时间填坑了.今天介绍xv6的第一个实验u ...
- CS144 计算机网络 lab1
CS144 计算机网络 lab1 上一学期刚学习了计算机网络这门课程,感觉还是挺有意思的,了解到CS144的lab所以便打算利用假期练练手,顺便也尝试着开始写博客.代码风格还很新手,多多包涵,欢迎讨论 ...
最新文章
- 路由器snmp配置_基于keepalived配置数据库主从实现高可用
- Android 调试工具集合
- 从Java 10中删除的API
- QPW 提现申请单表(暂时不做)(tf_cash_apply)
- MySQL于ON DUPLICATE KEY UPDATE采用
- 网址发布页模板,带网址测速+域名检测功能
- 设计灵感|浓浓人文感!中文活动海报设计学习案例
- 8880 e7 v2配什么主板_MATX主板配什么机箱好?曜越Tt启航者A3装机记
- 深度学习3-tensorflow2.0模型训练-自定义模型训练
- paip.python错误解决6
- 使用计算机键盘的基本步骤,键盘指法练习方法
- JAVA办公管理系统(OA)
- 计算机信息管理不会电脑,不要抱怨网速慢.只怪你不会调网速★让你的电脑一点都不卡...
- python实现multi函数参数个数不限、返回所有参数乘积_实现multi( )函数,参数个数不限,返回所有参数的乘积。_学小易找答案...
- 【转】模仿绘画风格的算法:A Neural Algorithm of Artistic Style
- 100个世界上鲜为人知的“常识”
- RankNet学习思路+损函感悟+\pi \xu 学xi+交叉熵损函详
- linux 文件755权限的意思,Linux文件和目录的777、755、644权限解释
- 方程组通解的参数向量形式、基本变量和自由变量
- Python seek()和tell()函数详解
热门文章
- java中bean是什么_java中bean是什么意思?有什么作用 | 学步园
- 上汽集团进军网约车市场 滴滴的市场地位会被传统车企们挑战成功吗?
- PyCharm和Jupyter使用对比
- C fseek() and fteel()
- 获取QQ音乐歌曲播放源地址
- linux 25端口漏洞,Linux通过栈溢出进行提权实战(dpwwn03)
- 华硕飞行堡垒6 U盘安装win10系统步骤:
- QPS 与 TPS 简介
- cnpm : 无法加载文件 D:\myDEV\newNode\node_global\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com
- nodejs中的__filename和__dirname