在(一)中详细写了3.1和3.2两个任务,这次来写一下3.3和对Lab1的感悟。
3.3 Social Network
该任务拟在模拟刻画社交网络,是对有向图的处理,要求实现加入点、有向边、计算最小有向距离三个功能。这一部分需要自己设计框架和方法。
3.3.1 设计/实现FriendshipGraph类
(1)采用邻接表结构:
Class Node.Edge:邻接表中的边,每个Edge对象存储了邻接表中的下一条边,以及对应的边的两个Person所对应的Node。
· Method Node.LoadData:将Person对象导入到Node中进行存储。
· Method Node.addNode:将相应的Node加入到Node的链表中
· Method Node.addNodeEdge:将新的边加入到对应的Node中并更新每个Node后的Edge链表。
(2)addVertex方法: 在图中增加一个新的节点。
首先对Person的名字进行判重:用HashSet记录下已加入的所有Person的名字,每当新加入一个Person则进行判断是否在集合中,如果不在集合中就新建一个Node类。
(3)addEdge方法:在图中加入新的边.
(4)getDistance方法: 计算任意两个Person之间的“距离”,若没有任何社交关系则输出“-1”。
两个Person之间计算使用BFS,默认边权为1,则在搜索到边时加1即可,搜索到目标点退出;特殊情况根据要求输出0或-1。
3.3.2 设计/实现Person类
Person类是为了实现将每一个人对应到一个Person对象,并存储名字的信息。
3.3.3 设计/实现客户端代码main()
3.3.4 设计/实现测试用例
(1)重名测试:
(2)两个图测试:
测试结果:
实验过程中收获的经验和教训:
(1)Java库中的函数非常多,巧妙的调用可以大大提高编程效率
(2)Java编程与C语言在很多方面都很像,但正因如此很多小地方存在差异就极容易导致书写代码时忽略这些小细节,在调试时不易发现,就会浪费很多时间
(3)一个实验的工作量非常大,不能集中几天完成,一定要分散工作量,每天利用一些时间完成
(4)Java与C语言相似,但是Java的结构是C语言没有的,之前没有接触过Java,通过假期提前预习初步掌握了一些基本语法,能够勉强完成实验课内容。但是Java很多强大的功能还需了解和学习。
(5)Eclipse功能强大,在调用方法是的候补功能非常方便,界面也很简介清晰。
(6)Git的版本控制功能非常方便,每个人都有自己的代码仓库,同时还能与本地仓库以及Eclipse链接,功能很强大。