软件构造实验一
写在前面
又到了人民群众喜闻乐见的骂街发表意见的环节
鬼™知道我经历了什么
原来传说是真的🙂,大二专业课老师真的会默认windows是你开发出来的
这篇主要记录了实验中的一点java小知识
环境配置
开始是为了装Hexo的,装了Git,然后JavaIDE是Netbeens。这里惨痛教训,好像Netbeens和Eclipse的文本编辑的默认中文编码方式不一样,Netbeens是GBK,Eclipse是UTF-8,结果实验做完后发现用NetBeens写的P1的代码注释到Eclipse里面变成乱码了,但是使用“重启试试”之后又正常了…
新版的Eclipse叫Oxygen,Git的log按q退出查看
Eclipse中文语言包被我装崩掉了,开始界面变成了欢迎来到Errorlipse
点这里进入实验一仓库
P1
大致目标是写一个函数判断幻方,然后还要看看那个生成幻方的函数是怎么生成幻方的
主要是帮助回忆Java,这里有Tips
Java字符串中”\“是转义符,在写相对路径的时候可以这样写”.\\src\\P1\\txt\\1.txt”,我日打字到一半发现这个在Markdown里也是转义!!!上面那串字符打了三个\
读文件的大致格式是
try {
BufferedReader reader = new BufferedReader(new FileReader(new File(path)));
// read something
reader.close();
} catch (FileNotFoundException ex) {
// handle exception
} catch (IOException e) {
// handle exception
}
string.split是会产生空字符串的!
有时间的话学学正则表达式
学到了,如何做出一个幻方(奇数边长),从中间最上面的那个元素开始,每次填完一条对角线之后向下继续填下一条对角线,直到填满
P2
用乌龟画画
Turtle是一个类,里面有turn和forward两种方法,控制在二维平面上移动,走过的痕迹来画画
最坑爹的应该还是那个凸包了,因为Java里面调用sort巨麻烦,只好手动冒泡,Graham的主要思想还是按极角排序然后用叉积判断答案栈顶和栈顶下面那个元素和新加进来的点的左右关系
最后自己画了个分形Julia集!原来分形就是用Matlab在画布上描点
P3
主要好像是要写BFS和JUnit测试
目前我所了解的JUnit测试
想快速入门直接看仓库里的代码,主要是assert系列函数的使用
@Test // 要标注
public void testFunction () { // 我写的测试里面就用了这三个...
assertFalse("提示信息", 表达式);
assertTrue("提示信息", 表达式);
assertEquals("提示信息", 目标值,表达式);
}
@Test(expeced = Exception.class)
public void testEnable () {
// Exception是要检测的异常
}
自己造数据然后根据跑出来的结果和自己的手动结果对一下看符不符合
在工程项目上面右键 -> 构建路径 -> 添加库 -> 添加JUnit4
P4
学Java新类最快的方法是直接看代码补全里面的说明!是直接看代码补全里面的说明!是直接看代码补全里面的说明!
抽象方法(函数)是只有声明没有实现的方法,抽象类是至少包含一个抽象方法的的类,接口是所有方法都是抽象方法的类
abstract是声明抽象的关键字,extends继承来实现未实现的方法,implements声明实现接口,一个类只能继承一个类,但可以实现多个接口
主要是Collections类的使用姿势
Set是一个抽象类,不能实例化,但是抽象接口的类作为一个参数传入的时候是可以直接对它操作的,Set的主要实现有两种,一种是HashSet,另一种是TreeSet
HashSet<T> testSet = new HashSet<> ();
testSet.add( element ); // 加入一个元素
testSet.contains( element ); // 检查是否包含某个元素
testSet.isEmpty( );
for (T i: testSet ) { // 遍历Set集
}
List也是一个抽象类,主要是ArrayList
ArrayList<T> testList = new ArrayList<> ();
testList.add( element );
testList.get( index ); // 输入下标,访问元素
testList.contains( element );
testList.indexOf( element );
for (T i : testList ) {
}
Arrays.asList(element1, element2); // 可以将元素作为一个List返回一个List类型
Map也是一个抽象类,用于把前一个类型映射到后一个类型上,主要用HashMap
HashMap<keyT, valueT> testMap = new HashMap<> ( );
testMap.put( keyElement, valueElement );
testMap.get( keyElement );
testMap.containsKey( keyElement );
for (keyT i : testMap.keySet( )) {
}
然后是Collection.sort,为了使用对一个自定义类的sort要写一个Comparator类的比较器
public class Class { // 要比较的类
public int number;
Class ( ) { }
}
public class classComparator implements Comparator<Class> { // 实现比较器
@Override // 重写标记
public int compare ( Class o1, Class o2 ) {
if (o1.number == o2.number)
return 0;
return o1.number > o2.number ? 1 : -1;
}
}
public void testSort ( ) { // 要调用sort的函数
List<Class> test = new List<> ( );
Collections.sort(test, new classComparator());
}
String的null和””是有区别的!String访问某个字符要用charAt(index)函数
String ans = "";
ans += "a";
System.out.println(ans);
// 结果是
// a
String ans = null;
ans += "a";
System.out.println(ans);
// 结果是
//nulla
String ans = "";
ans += ('Z' + ('a' - 'A'));
System.out.println(ans);
// 结果是
// 122
String ans = "";
ans += (char) ('Z' + ('a' - 'A'));
System.out.println(ans);
// 结果是
// z
String的toLowerCase函数是可以忽略string里面的非字母字符的,只把一个string里面的所有大写字母转为小写字母
这里加一个,String的split函数的行为非常奇怪!
String now = "abc@edf";
for (String i : now.split("@"))
System.out.println("->" + i);
/* 结果会是
-> abc
-> edf
*/
String now = "@abc@edf@@"
for (String i : now.split("@"))
System.out.println("->" + i);
/* 结果会是
->
->abc
->edf
更加奇怪的是now.split("@")[0]即不是""也不是null
这种现象只会出现在第一个非空被分割的子字符串前面
在P4的Extract中我只好用now.split("@").length == 0来判断这种情况
*/