软件构造实验1 part2

P3

1.1 Social
Network

该问题主要根据一个朋友圈的关系网建立一个无向图,并且计算出任意给定的两个人之间的距离。

主要考察了数据结构中有关图方面的知识,如广度优先搜索,邻接表的建立,以及Java中关于对象,类和方法的应用。

1.1.1 设计/实现FriendshipGraph类

l 设计思路:

² 要实现向图中添加点和边以及计算图中任意两点距离的方法;

² 其中需要注意不能向图中重复添加点或者边,所以添加点或者边时要判断当前图中是否已经添加了此点或者此边,若重复添加,则输出错误提示信息并终止程序运行;

² 另添加边时要注意边的两个顶点不能是同一个人,而且要注意如果要在两个 Person 对象 A 和 B 之间增加一条
社交关系,那么需要同时调用 addEdge(A,B)和
addEdge(B,A)两条语句,这样以便以后无向图向有向图的扩展。

l 主要介绍实现计算任意两人之间距离的设计思路

整体思路如下:

首先判断name1和name2是否满足以下三个的其中之一:

² 判断name2在整个关系图中是否为孤立点(即没有任何边可以到达该点)若是,则直接返回-1(这样避免了从name1进行大量的广搜而没有搜索到name2而进行的许多不必要的操作)

² 判断name1和name2是否是直接朋友,若是则返回1

² 判断name1和name2是否是同一个人,若是则返回0

若不满足上面三个,则运用图的广搜计算两人的距离,如下:

首先标记图中所有人的属性distance(该属性主要用来表示name1和name2之间的距离)为0,将name1标记为已访问点,使name1的所有朋友进入队列,并标记这些点为已访问点,并将其属性distance加1;

判断队列是否为空,若为空,直接返回-1,否则让队首出队,并判断其朋友是否包含name2,若包含则name1和name2的距离为队首的distance+1;若不包含则让队首的朋友中未访问过的人入队,并将这些人的属性distance赋值为队首的distance+1;然后重新判断队列是否为空,并重复上述操作,直至循环结束或退出循环,返回距离。

1.1.1 设计/实现Person类

l 设计思路:

² Person类主要用来设置有关每个人的信息的属性,如名字,他所有的朋友,以及辅助在计算两个人之间的距离时的辅助信息,如该点是否被访问过,该点在关系网中是不是孤立点(即没有任一条边可到达该点),以及记录两个人之间的距离

² 由于设置了person类中的属性都为private,所以构造了一些方法用来访问这些属性或者改变这些属性的值,如下图所示:

在这里插入图片描述

P4 Tweet Tweet

1.1.1 Problem 1: Extracting data from tweets

Ø 该问题由以下两个方法组成:

1.1.1.1
getTimespan()

l 设计思路:

直接遍历tweets的列表里的推文,利用Instant里的isBefore和isAfter函数找到推文列表里的最早的发推文时间minTime和最晚的发推文的时间maxTime,则两者便构成了发推文的时间段

1.1.1.2
getMentionedUsers()

l 设计思路:

该函数主要从所有推文中筛选出被@的用户名,需要构造正则表达式来筛选复合tweet用户名合法字符的用户,构造的正则表达式如下:

|([A-Za-z0-9_-]+)@([A-Za-z0-9_-]+)”,其中第一个()里面的内容表示@前面应该是用户名中的非法字符,第二个()里面的内容表示@后面的应该是用户名中的合法字符,该正则表达式可以找到出现在推文开头或中间以及结尾的被@的用户,找到这些字符串后,然后用Matcher 中的group函数提取匹配第二个()里的内容,并以小写形式(用户名的大小写不敏感,所以直接以小写形式写入)写入set内

1.1.1 Problem 2: Filtering lists of tweets

Ø 该问题由以下三个方法组成

1.1.1.1
writtenBy()

l 设计思路:

利用Tweet对象中的getAuthor方法提得到每一篇推文的作者,然后与参数username相匹配,如果匹配成功,则加入集合,直到遍历全部推文找到所有该作者写的推文

1.1.1.2
inTimespan()

l 设计思路:

该函数主要实现从tweet列表中提取出在所给的时间段timespan中发表的推文,利用Timespan中的getStart函数和getEnd函数获得timespan的最早时间和最晚时间,然后遍历推文,找到符合这个范围发表的推文存入List中并返回

1.1.1.3
Containing()

l 设计思路:

利用正则表达式\W+将每一篇推文分割成包含文章所有单词的字符串数组,然后判断这个字符串是否含有字符串数组words中的字符串,若包含,则将该推文添加到List中

1.1.1 Problem 3: Inferring a social network

Ø 该问题主要由以下两个方法构成

1.1.1.1
guessFollowsGraph()

l 设计思路:

该方法主要实现提取每一个作者的推文中@的用户:

² 首先利用tweet中的提取推文作者的函数将所有推文的作者加入一个Set集合中(由于Set集合可保证元素的不重复,所以集合中不会重复添加作者名);

² 然后对于每一个作者name,利用Filter类中的writtenBy方法提取每个name所发表的所有推文,然后利用Extract类中的getMentionedUsers方法提取作者在这些推文中@的用户,将其加入一个Set集合内,然后将其加入Map集合follow中

1.1.1.2
Influencers()

l 设计思路:

² 首先得到所有推文的作者加入集合Set中

² 然后对于每一个作者,将其文章中@到的用户加入Map中,在加入之前首先判断该用户是否已经在Map中,若是第一次加入,则将其影响力记为1,若不是,则在其原来影响力的基础上再加1

² 最后将Map中的所有key加入到一个动态数组中,将该动态数组根据Map中其所对应的影响力由大到小进行排序,然后返回该List

1.1.1 Problem 4: Get smarter

该问题主要是对第三个问题的guessFollowsGraph方法进行进一步的改进,从而能够更深入地找寻用户之间的关系

l  设计思路:

²  在第三题的通过作者写的推文中的@的人有可能是作者关注的人,影响着作者以外,又增加了通过标签来判断两人是否有影响,即若两个人的推文中带有相同的标签,则有一定的可能性说明两者相互影响,则对作者追随的人的列表里就要再添加和作者带有相同话题的用户

²  首先利用正则表达式"#([A-Za-z]+)"找到每个作者所写的全部推文中所带的标签,若作者没有带过标签,则作者追随的人就只包括他文章中@的人,若作者的推文带标签,则通过构造的另一个辅助的方法MyContaining来找到和作者带有相同标签的推文,然后把这些推文的作者也加入作者追随的人的集合中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值