在此记录一下软件构造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);
即可达到预期效果