HIT软件构造2020春Lab1-Social Network (CMU)

在此记录一下软件构造Lab1第三部分实现过程中的踩坑与解决记录

1.创建目录

不多赘述,目录结构如下
在这里插入图片描述

2.完成项目所需方法

1.创建Person类

类中含有私有成员name和方法getname,在此不多赘述

2.创建构造函数

创建构造函数Person(String name)用于new出Person类时进行赋予名字

3.成员变量

在FriendshipGraph中,我创建了map<String, Integer> map用来对人名和所处邻接矩阵中的位置的映射进行存储,ArrayList<ArrayList> list用于存储n可变的二维邻接矩阵,int[][] path用于保存任意两点间的距离

4.addVertex

实现方法:将人名读入后,先进行判断该人名是否已存在于map中,若不存在,则在map中创建在邻接矩阵位置的映射表,然后对应在邻接矩阵list中添加行列,并将其初始化为Integer.MAX_VALUE表示无连线。

在如此创建人名映射的时候,我不由想到删除成员时候的操作。因为删除时删除了键值对,则对应的邻接矩阵的位置无内容,需要进行修改,将对应index最大的成员的映射“挪”到删除的成员的位置上,因此我添加了deleteVertex()方法用于删除成员,并进行了测试(此项并非实验要求)

5.addedge

先进行判断输入的人是否是同一个人(名字相同也算同一个人),然后判断输入的人名是否已存在于map中。若上述两个选项回答为否和是,则对应邻接矩阵的位置置为1表示前者认识后者。(若想互相认识需交换两人顺序并再次调用该方法)

6.getDistance

给出任意两个人之前是否认识,且计算出距离。我使用floyd算法算出任意两人间的距离,并将其存储在path二维数组中。再此不多赘述。

3.创建test测试文件

1.导入junit包

在工程名上右键,打开模块设置
在这里插入图片描述
如下
在这里插入图片描述
导入后在内容前打勾并点击“应用”即可

2.创建测试文件

如下,在类名上右键-转到-测试
在这里插入图片描述
点击生成测试文件(我由于已经创建测试文件因此会有上面哪个选项)
在这里插入图片描述
测试库选择junit4,下面勾选想要测试的方法后,点击确定即可
在这里插入图片描述
创建出的测试文件应该是与原类在一起,而要求的文件路径为:在这里插入图片描述
操作方法:新建目录test,再点击test新建目录P3,然后将test文件移动到该目录下,形成如下目录
在这里插入图片描述
在这里插入图片描述
但此时的测试文件将无法使用。解决办法:在test文件夹上右键-标记目录为-测试源,即可正常使用
在这里插入图片描述

3.测试文件书写

使用assert代码进行测试,其中两个参数前者为预期结果,后者为函数调用结果。生成测试结果如下
在这里插入图片描述

4.踩坑记录!

我创建list时,原本的代码如下:

ArrayList<Integer> temp = new ArrayList<>();
temp.add(Integer.MAX_VALUE);
temp.add(Integer.MAX_VALUE);
temp.add(Integer.MAX_VALUE);
temp.add(Integer.MAX_VALUE);
for (int i=0; i<4; i++) {
    testlist.add(temp);
}

创建4*4的邻接矩阵,但是在改变其中一个的值的时候,发现所有的值都被改变

//期待结果:只有第一行第二个是1,其他都是MAXINT
//实际结果:第二列整列都变成了1
testlist.get(0).set(1, 1);

问题原因:只创建了一个temp,而在list中,实际存放的是指向Arraylist的指针,这样做会使四个指针全部指向temp,而修改其中一个的值,自然会使所有结果同时改变。因此,修改代码如下:

for (int i=0; i<4; i++) {
	ArrayList<Integer> temp = new ArrayList<>();
	temp.add(Integer.MAX_VALUE);
    temp.add(Integer.MAX_VALUE);
   	temp.add(Integer.MAX_VALUE);
    temp.add(Integer.MAX_VALUE);
    testlist.add(temp);
}
testlist.get(0).set(1, 1);

即可达到预期效果

如有错误,欢迎指正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值