目录
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):
- 首先遍历所有的点,找到最左下角的点;
- 以找到的点为基点,y轴正向为目前偏移角,开始依次找顺势针转角最小的点,记录这个点并将他加入到凸包集合中,以这次的偏向角累加上之前的角度度作为下一次的目前偏向角;
- 循环直到再次遇到最左下角为止退出。
但是在测试的遇到了问题:该代码也会返回位于凸包两个顶点连线上的点。
因此将该代码稍作修改,遍历时每次选择转向角最小、距离最长的点,加入集合:
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);
}
}