Lab1
实验要求
训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。
另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
Magic Squares
1.本任务重点在于I/O。
采用缓冲字符输入流BufferedReader
FileReader fr = new FileReader(fileName);
BufferedReader in = new BufferedReader(fr);
在java中拥有异常这个概念,在文件读入时就存在检查性异常:要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
所以要采用try{……} catch(){……}语句来捕获可能存在的异常。
这里含有打开不存在文件、输入不合法的异常。
采用缓冲字符输出流BufferedWriter
2.处理数据
在处理数据中,首先根据描述以间隔符“\t”分割字符串数组,然后检验是否满足数字间隔都是“\t”:如果有非法间隔符,则存在字符串含有非自然数(0~9),遍历字符串的每个字符并比较。
3.幻方
利用幻方定义,首先判断行列是否相等:(变量都是整形)利用math求数据总和sum开方row,如果row*row=sum,则行列数相等。
求取行、列、对角线、反对角线和,首先将第一行的和作为标准,将和与它相比,得出结果。
4.La Loubere 法奇数幻方构造
一居上行正中央:数字 1 放在首行最中间的格子中;
依次斜填切莫忘:向右上角斜行,依次填入数字;
上出框时向下放:如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中;
右出框时向左放:同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中;
排重便在下格填:如果数字右上的格子已被其它数字占领,就将 填写在下面的格子中;
右上排重一个样:如果朝右上角出界,和上面重复的情况做同样处理。
Turtle Graphics
在https://github.com/rainywang/Spring2019_HITCS_SC_Lab1/tree/master/P2中选择下载压缩包。
在本任务中先创建一个接口Turtle,在DrawableTurtle实现具体函数。
可使用方法
DrawableTurtle 初始化起点、方向、颜色、动作
forward(int steps) 将以当前方向和位置长画为steps的直线的动作加入actionList
turn(double degrees) 将当前方向顺时针旋转degrees(弧度制)的动作加入actionList
color(PenColor color) 将笔的颜色设置为color中颜色的动作加入actionList
draw() 在画布中画出actionList所有动作
之后所有基本图形利用以上的基本方法即可完成
Convex Hulls
该闭凸包问题可以采取简单的礼品包装问题:每次找到与当前点形成角度(顺时针)最小的点作为下一个点,这样就可以完成闭凸包。
注意事项
(1) 结束条件:从第一个点开始寻找直到又找到第一个点。
(2)避免死循环的问题:从当前点不能回到上次选过的点。
Social Network
FriendshipGraph类
1.addVertex
添加顶点。
采用List保存,还需要判断这个点是否已经被加入(这里采用名字是否已经存在来判断)
2.addEdge 加边
根据有向图的定义,加边必须定义谁是起点和终点。这里确定第一个参数为起点,第二个为终点,而且还需要创建二元数组保存边。
3.Floyd 计算最短距离
根据Floyd算法,可以算出所有的点到其他点的最短距离(如果不连通或该点对该点距离为MAX:一个超大值)。
这里注意:如果图发生更新则需要重新计算。
4.getDistance 根据参量返回
(1) 参量相同。根据下标相同确定返回值为0
(2) 两点不连通。根据最短距离为MAX,返回-1
(3) 两点联通。返回之前保存的最短距离。
2.Person类
Person类需要保存人类的基本信息,根据提示,Person类需要得到人的名字,而图的基本类型采取矩阵,所以需要矩阵下标,故Person类还要有下标。
3.Main
将指示代码写入主函数,经检测与提示相符。
4.Test
java中利用assert可以将理论值和实际值比较,基于此完成测试
Tweet Tweet
Problem 1: Extracting data from tweets
(1) getTimespan
求推特的公共时间范围可以利用Instant类函数isBefore、isAfter,然后求出最早的时间和最晚的时间
(2) getMentionedUsers
提到的名字必须以@开头,并且@前和名字后必须不是有效字符
1.是否为有效字符
利用isLegal函数判断
2.找到@
利用循环找到@
判断@前不是有效字符:@前是无效字符;@前无字符 j代表推文字母顺序。
判断名字后不是有效字符:结尾有字符且不是有效;结尾无字符将end赋为长度
Problem 2: Filtering lists of tweets
(1) writtenBy
利用Tweet类getAuthor得到名字,再判断名字是否相同确定是否加入返回的List。
(2) inTimespan
利用Instant类isAfter和isBefore找到要求时间范围内的推特。
(3) containing
判断推文是否包含某个字符串,可以以外层循环为推文,内层循环为字符串,然后判断推文中是否包含字符串。
首先根据推文规则可以将它以“ ”分割,然后与word比较,由于不要求区分大小写,所以自行完成了关键函数com(不区分大小写比较字符串),这个循环条件设为word,因为之前分割的字符串可能包含一些标点符号,所以只要比较前word.length即可。
Problem 3: Inferring a social network
(1) guessFollowsGraph
可以利用之前完成的函数getMentionedUsers,将@的明星作为key,推文的主人作为value,这里需要注意 @本人时跳过。
(2) influencers
该函数需要根据粉丝多少降序输出。而粉丝数量可以由Set.size()获得,但是Map并没有下标,所以不能用其他数组记录顺序下标,所以采用每次输出尚未输出的当前最大值:利用list temp.add记录已被输出的。
Problem 4: Get smarter
采用方案:一个人的粉丝的粉丝还是他的粉丝。(已完成初始粉丝)
DFS算法
最外层循环:依此计算各个人的粉丝
第一个内层循环:将第一层粉丝记录
第二个内层循环:将所有粉丝加入
最内层循环:判断下一层粉丝是否存在:如果存在将此人加入粉丝,并弹出栈,并且将此人粉丝加入栈中,直至此人粉丝的粉丝…不存在,依此类推完成DFS。