软件构造 Lab1总结

1 MagicSquare

1.1 关于读文件问题

FileInputStream fileInputStream = new FileInputStream(file); //使用FileInputStream实现读取txt文件内容
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); //使用BufferedReader来按行读入
				
while ((line = bufferedReader.readLine()) != null) {}

个人认为FileInputStream+BufferedReader方法很好用,在返回矩阵判定时,应加入代码行:

bufferedReader.close();

而不是让文件一直在后台打开,直到系统自动回收,这样会占用不必要的资源。

1.2 关于写文件的问题

和读文件相似:

writeFile.createNewFile();
FileWriter writer = new FileWriter(writeFile);
BufferedWriter out = new BufferedWriter(writer);
…
out.flush();
out.close();

1.3 关于相对路径的问题

path = "src/P1/txt/" + String.valueOf(i) + ".txt";

相对路径是从Java项目开始算起的,具体查看右键对应文件,后查看Properties:
在这里插入图片描述

1.4 关于异常表示的问题

个人拙见是throws Exception只能简单地抛出异常,不如try-catch-finally来得好,具体格式如下:

try{
	Map[row][i] = Integer.valueOf(split[i - 1]).intValue();
}catch(NumberFormatException e) { //非法输入判断
	System.out.println(path + " exists invalid number.");
	bufferedReader.close();
	return false;
}

2 TurtleSoup

2.1 关于处理凸包返回顶点的问题

采用的是边界漫游法,时间复杂度为O(n^2):

  1. 首先遍历所有的点,找到最左下角的点;
  2. 以找到的点为基点,y轴正向为目前偏移角,开始依次找顺势针转角最小的点,记录这个点并将他加入到凸包集合中,以这次的偏向角累加上之前的角度度作为下一次的目前偏向角;
  3. 循环直到再次遇到最左下角为止退出。

但是在测试的遇到了问题:该代码也会返回位于凸包两个顶点连线上的点。

因此将该代码稍作修改,遍历时每次选择转向角最小、距离最长的点,加入集合:
在这里插入图片描述

2.2 关于JUnit测试时NoClassDefFoundError的问题

报错情况如下:
在这里插入图片描述
当时查了很久,导入库和导入外部包都试过了,也试过改classpath,但都失败了,后来一个偶然的尝试,发现是JRE的问题,当时图省力没有改编译环境,选了JavaSE 10,导致和JUnit路径产生冲突,改成1.8后问题就迎刃而解了。
在这里插入图片描述

3 Social Network

3.1 关于检测名字重复的问题

虽然不能在Person类中使用static方法,但是在addVertex方法中进行判断也能起到同样的效果:

public Set <Person> addVertex(Person person) throws Exception {
	if (nameSet.contains(person.getName())) {
		throw new Exception("出现重名" + person.getName());
	}
	nameSet.add(person.getName());
	vertex.add(person);
	return vertex;
}

3.2 关于图的最短路径搜索的问题

由于边权值均为1,仅仅靠广度优先搜索即可找到单源最短路径:

public int getDistance(Person personFrom,Person personTo) { //使用广度优先搜索
	Queue <Person> queue = new LinkedList <Person>();
	Set <Person> visited = new HashSet <Person>();
	if (personFrom == personTo) {
		return 0;
	}
	queue.add(personFrom); 
	personFrom.dis = 0;
		
	while (!queue.isEmpty()) {}
	return -1; //两人没有联系
}

3.3 关于编写JUnit测试的问题

一般遵循以下规范:

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class ClassNameTest{
    /**
     * Tests that assertions are enabled.
     */
    @Test(expected = AssertionError.class)
    public void testAssertionsEnabled() { 		assert false; 
    }
	/**
     * Tests MethodName.
     */
    @Test
    public void MethodNameTest(){
		//Code
        assertEquals(RealValue, ExpectedValue);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值