20060824
课前做了一个小实验:定义一个100M的数组,结果出现内存超出错误,这个错误随然我们自己在写小的程序的时候出现的机率不是很大,但是在真
实的项目中的确是不可避免的,比如在写上传的程序时,我们也许会把这一点忽略(我们会按我们主观的想法定义一个数组,但是偏有人不按我们
的套路出牌,这也是很正常的,如果他所传的东西很大,往往就会出现这种错误).
Contentlength:1000000
xxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
long ben=read("Contentlength");
byte buf = new byte[len];
imputstream.read(buf);
讲课内容:
今天主要要学习递归的使用,并且做了几个递归应用的小程序,以便对递归更加熟悉:
1.利用递归求出一个十进制数的两进制表示形式
2.求最大公约数(最大公约数的法则:用两个数的大数减小数,结果与最小数进行求差,得到的数再与这两个数的小数进行减,以此类推,直到最小
数与差相等为止,这个数便是所求数值)
3.“汉诺塔”问题用递归进行运算的算法:(很重要)
程序代码如下:(大概思想:只想出中间条件便于解决问题,假设有N个盘子,若求出N个由A到C的过程,在此过程之前需要做的把N-1个由A移
至B以及此事件之后(N-1个由B移至C)所要做的事情即可)
public class Demo{
public static void yueshu(int num1,int num2){
if(num1 == num2){
System.out.println(num1);
}else{
yueshu(abs(num1,num2),Math.min(num1,num2));
}
}
public static int abs(int num1,int num2){
return num1>num2 ? num1-num2 : num2-num1;
}
public static int min(int num1,int num2){
return num1>num2 ? num2 : num1;
}
public static void DrawR(int Number){
}
public static void hanon(int n,char a,char b,char c){
if(n == 1){
move(1,a,c);
return;
}
hanon(n-1,a,c,b);
move(n,a,c);
hanon(n-1,b,a,c);
}
public static void move(int n,char a,char c){
System.out.println(n + ":" + a + "-->" + c);
}
public static void main(String args[]){
//yueshu(10,25);
hanon(4,'A','B','C');
}
}
今天的重点是利用递归运算以树型的形式显出某个目录下的所有子目录以及文件。上课所用代码如下:
import java.io.*;
class FileWrapper extends File{
private boolean bLast = false;
private FileWrapper parent = null;
public FileWrapper(File f,boolean bLast,FileWrapper parent){
super(f.getPath());
this.parent = parent;
this.bLast = bLast;
}
public FileWrapper getMyParent(){
return parent;
}
public boolean isLast(){
return bLast;
}
}
public class ListFile{
public static String makeSpaces(int level){
StringBuffer sbf = new StringBuffer();
for(int i=0;i<level; i++){
sbf.append(" ");
}
return sbf.toString();
}
public static void viewTree(FileWrapper fw){
if(!fw.exists()){
System.out.println("file is no ");
return;
}
System.out.println(makePrefix(fw) + fw.getName());
if(fw.isDirectory()){
File [] fs = fw.listFiles();
for(int i = 0;i < fs.length;i++){
File f1 = fs[i];
FileWrapper fw1 = null;
if(i == fs.length - 1){
fw1 = new FileWrapper(f1,false,fw);
}else{
fw1 = new FileWrapper(f1,true,fw);
}
viewTree(fw1);
}
}
}
public static void main(String[] args){
File File;
if(args.length <1){
File = new File(".");
}
else{
File = new File(args[0]);
}
FileWrapper fw = new FileWrapper(File,true,null);
viewTree(fw);
}
public static void makeParentPrefix(FileWrapper fw,StringBuffer prefix){
if(fw.getMyParent().getMyParent() == null){
return;
}
FileWrapper parent = fw.getMyParent();
if(parent.isLast()){
prefix.append(" │");
}else{
prefix.append(" ");
}
makeParentPrefix(parent,prefix);
}
public static String makePrefix(FileWrapper fw){
if(fw.getMyParent() == null){
return "";
}
StringBuffer sbf = new StringBuffer();
if(fw.isLast()){
sbf.append("─├");
}
else{
sbf.append("─└");
}
makeParentPrefix(fw,sbf);
sbf.reverse();
return sbf.toString();
}
}
新的一种设计模式:
访问器设计模式
杂记:
要通过执行ANT的命令行窗口给BUILD。XML文件中的JAVA任务执行的类传递参数,怎么做?
在属性文件中这样写:<arg value="${dir}"/> 可以通过为ARGS传参数的形式进行调用 如:ANT —Ddir="c:/" 这样传参数即可
再次提醒:在定义成员变量时不要轻意定义成成员变量,