IO-5


IO-5

01_File类递归练习(统计该文件夹大小)

* 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小

public class Test1 {

          * 从键盘接收一个文件夹路径

          * 1,创建键盘录入对象

          * 2,定义一个无限循环

          * 3,将键盘录入的结果存储并封装成File对象

          * 4,对File对象判断

          * 5,将文件夹路径对象返回

          *

          * 统计该文件夹大小

          * 1,定义一个求和变量

          * 2,获取该文件夹下所有的文件和文件夹listFiles();

          * 3,遍历数组

          * 4,判断是文件就计算大小并累加

          * 5,判断是文件夹,递归调用

         publicstatic void main(String[] args) {

                   //Filedir = new File("F:\\day06");

                   //System.out.println(dir.length());  //直接获取文件夹的结果是0

                   Filedir = getDir();

                   System.out.println(getFileLength(dir));           

         }

        

          * 从键盘接收一个文件夹路径

          * 1,返回值类型File

          * 2,参数列表无

         publicstatic File getDir() {

                   //1,创建键盘录入对象

                   Scannersc = new Scanner(System.in);

                   System.out.println("请输入一个文件夹路径:");

                   //2,定义一个无限循环

                   while(true){

                            //3,将键盘录入的结果存储并封装成File对象

                            Stringline = sc.nextLine();

                            File dir = new File(line);

                            //4,对File对象判断

                            if(!dir.exists()){

                                     System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:");

                            }elseif(dir.isFile()) {

                                     System.out.println("您录入的是文件路径,请输入一个文件夹路径:");

                            }else{

                                     //5,将文件夹路径对象返回

                                     returndir;

                            }                 }        }

          * 统计该文件夹大小

          * 1,返回值类型long

          * 2,参数列表File dir

         publicstatic long getFileLength(File dir) {        //dir= F:\day06\day07

                   //1,定义一个求和变量

                   longlen = 0;

                   //2,获取该文件夹下所有的文件和文件夹listFiles();

                   File[]subFiles = dir.listFiles();   //day07Demo1_Student.clas Demo1_Student.java

                   //3,遍历数组

                   for(File subFile : subFiles) {

                            //4,判断是文件就计算大小并累加

                            if(subFile.isFile()){

                                     len= len + subFile.length();

                            //5,判断是文件夹,递归调用

                            }else{

                                     len= len + getFileLength(subFile);

                            }

                   }

                   returnlen;

         }

}

 

02_File类递归练习(删除该文件夹)

* 需求:2,从键盘接收一个文件夹路径,删除该文件夹

public class Test2 {

          * 分析:

          * 1,获取该文件夹下的所有的文件和文件夹

          * 2,遍历数组

          * 3,判断是文件直接删除

          * 4,如果是文件夹,递归调用

          * 5,循环结束后,把空文件夹删掉

         publicstatic void main(String[] args) {

                   Filedir = Test1.getDir();  //获取文件夹路径,注意点!!!

                   deleteFile(dir);   //注意:无返回值类型只能单独调用,不能赋值调用!!!

 

                   if(!dir.exists()) {

                            System.out.println("删除成功!");

                   }

         }

          * 删除该文件夹

          * 1,返回值类型 void

          * 2,参数列表File dir

         publicstatic void deleteFile(File dir) {      

                   //1,获取该文件夹下的所有的文件和文件夹

                   File[]subFiles = dir.listFiles();           

                   //2,遍历数组

                   for(File subFile : subFiles) {

                            //3,判断是文件直接删除

                            if(subFile.isFile()){

                                     subFile.delete();

                            //4,如果是文件夹,递归调用

                            }else{

                                     deleteFile(subFile);                    

                            }

                   }

                   //5,循环结束后,把空文件夹删掉

                   dir.delete();

                 }     }

 

03 File类递归练习(拷贝)

* 需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

public class Test3 {

          * 分析:

          * 1,在目标文件夹中创建原文件夹

          * 2,获取原文件夹中所有的文件和文件夹,存储在File数组中

          * 3,遍历数组

          * 4,如果是文件就用io流读写

          * 5,如果是文件夹就递归调用

         publicstatic void main(String[] args) throws IOException {

                   Filesrc = Test1.getDir();

                  File dest = Test1.getDir();

                   if(src.equals(dest)){

                            System.out.println("目标文件夹是源文件夹的子文件夹");

                   }else{

                            copy(src,dest);

                   }

         }

          * 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

          * 1,返回值类型void

          * 2,参数列表File src,Filedest

         publicstatic void copy(File src, File dest) throws IOException {

                   //1,在目标文件夹中创建原文件夹

                   FilenewDir = new File(dest, src.getName());

                   newDir.mkdir();

                   //2,获取原文件夹中所有的文件和文件夹,存储在File数组中

                   File[]subFiles = src.listFiles();

                   //3,遍历数组

                   for(File subFile : subFiles) {

                            //4,如果是文件就用io流读写

                            if(subFile.isFile()){

                                     BufferedInputStreambis = new BufferedInputStream(new FileInputStream(subFile));

                                     BufferedOutputStreambos =

                                                        newBufferedOutputStream(new FileOutputStream(new File(newDir,subFile.getName())));

                                    

                                     intb;

                                     while((b= bis.read()) != -1) {

                                               bos.write(b);

                                     }

                                    

                                     bis.close();

                                     bos.close();

                            //5,如果是文件夹就递归调用

                            }else{

                                     copy(subFile,newDir);

                            }    }   }   }

 

 

 

04 File类递归练习(按层级打印)

* 需求:4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如:

         aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来

         aaa

                   bbb.txt

                   ccc.txt

                   ddd.txt    

                   eee

                            fff.txt

                            ggg.txt

public class Test4 {

          * 分析:

          * 1,获取所有文件和文件夹,返回的File数组

          * 2,遍历数组

          * 3,无论是文件还是文件夹,都需要直接打印

          * 4,如果是文件夹,递归调用

         publicstatic void main(String[] args) {

                   Filedir = Test1.getDir();                              //获取文件夹路径

                   printLev(dir,0);

         }

 

         publicstatic void printLev(File dir,int lev) {

                   //1,把文件夹中的所有文件以及文件夹的名字按层级打印

                   File[]subFiles = dir.listFiles();

                   //2,遍历数组

                   for(File subFile : subFiles) {

                            for(inti = 0; i <= lev; i++) {

                                     System.out.print("\t");

                            }

                            //3,无论是文件还是文件夹,都需要直接打印

                            System.out.println(subFile);

                            //4,如果是文件夹,递归调用

                            if(subFile.isDirectory()){

                                     //printLev(subFile,lev+ 1);

                                     printLev(subFile,++lev);  //不能用++lev或lev++!!!

                            }  } }  }

 

 

 

05_递归练习(斐波那契数列)

* 不死神兔

* 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。

* 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,

* 问:一对刚出生的兔子,一年内繁殖成多少对兔子?

* 1 1 2 3 5 8 13

* 第一个月一对小兔子                                               1

* 第二个月一对大兔子                                               1

* 第三个月一对大兔子生了一对小兔子              2

* 第四个月一对大兔子生了一对小兔子

*                一对小兔子长成大兔子                          3

* 第五个月两对大兔子生两对小兔子        

*                一对小兔子长成大兔子                          5

public class Test5 {

         *1 = fun(1)

         *1 = fun(2)

         *2 = fun(1) + fun(2)

         *3 = fun(2) + fun(3)

         publicstatic void main(String[] args) {

                   //demo1();

                   System.out.println(fun(8));

         }

 

         publicstatic void demo1() {

                   //用数组做不死神兔

                   int[]arr = new int[8];

                   //数组中第一个元素和第二个元素都为1

                   arr[0]= 1;

                   arr[1]= 1;

                   //遍历数组对其他元素赋值

                   for(inti = 2; i < arr.length; i++) {

                            arr[i]= arr[i - 2] + arr[i - 1];

                   }

                   //如何获取最后一个数

                   System.out.println(arr[arr.length- 1]);

         }

 

      * 用递归求斐波那契数列

         publicstatic int fun(int num) {

                   if(num== 1 || num == 2) {

                            return1;

                   }else{

                            returnfun(num - 2) + fun(num - 1);

                   }

         }

}

 

 

 

06_递归练习(1000的阶乘所有零和尾部零的个数)

* 需求:求出1000的阶乘所有零和尾部零的个数,不用递归做

public class Test6 {

         *  需求:求出1000的阶乘所有零和尾部零的个数,不用递归做

         publicstatic void main(String[] args) {

                   /*intresult = 1;

                   for(inti = 1; i <= 1000; i++) {

                            result= result * i;

                   }

                  

                   System.out.println(result);               //因为1000的阶乘远远超出了int的取值范围

                   */

                   //demo1();

                   demo2();

         }

 

         publicstatic void demo2() {               //获取1000的阶乘尾部有多少个零

                   BigIntegerbi1 = new BigInteger("1");

                   for(inti = 1; i <= 1000; i++) {

                            BigIntegerbi2 = new BigInteger(i+"");

                            bi1= bi1.multiply(bi2);     //将bi1与bi2相乘的结果赋值给bi1

                   }

                   Stringstr = bi1.toString();        //获取字符串表现形式

                   StringBuildersb = new StringBuilder(str);

                   str= sb.reverse().toString();   //链式编程

                  

                   intcount = 0;                                         //定义计数器

                   for(inti = 0; i < str.length(); i++) {

                            if('0'!= str.charAt(i)) {

                                     break;

                            }else{

                                     count++;

                            }

                   }

                  

                   System.out.println(count);

         }

 

         publicstatic void demo1() {               //求1000的阶乘中所有的零

                   BigIntegerbi1 = new BigInteger("1");

                   for(inti = 1; i <= 1000; i++) {

                            BigIntegerbi2 = new BigInteger(i+"");

                            bi1= bi1.multiply(bi2);     //将bi1与bi2相乘的结果赋值给bi1

                   }

                   Stringstr = bi1.toString();        //获取字符串表现形式

                   intcount = 0;

                   for(inti = 0; i < str.length(); i++) {

                            if('0'== str.charAt(i)) {      //如果字符串中出现了0字符

                                     count++;                              //计数器加1

                            }

                   }

                   System.out.println(count);

         }

}

-------------------------------------------------------------------------------------------------

public static void main(String[] args) {

                   BigIntegerbi1 = new BigInteger("1");

                   for(inti = 1; i <= 1000; i++) {

                            BigIntegerbi2 = new BigInteger(i+"");

                            bi1= bi1.multiply(bi2);     //将bi1与bi2相乘的结果赋值给bi1

                   }

                   Stringstr = bi1.toString();        //获取字符串表现形式

                   char[] ch =str.toCharArray();

                   intcount = 0;

      *//1000的阶乘共有多少0!!!

                   /*for(inti = 0; i < ch.length; i++) {

                            if('0'== ch[i]) {  //如果字符串中出现了0字符

                                     count++;                              //计数器加1

                            }

                   }

                   System.out.println(count);*/

     *//1000的阶乘尾部共有多少个0!!!

                   for(inti = ch.length-1; i >=0; i--) {

                            if('0'== ch[i]) {  //如果字符串中出现了0字符

                                     count++;                              //计数器加1

                            }else{

                                     break;

                            }

                   }

                   System.out.println(count);

                  

         }

 

07_递归练习(1000的阶乘尾部零的个数)

* 需求:求出1000的阶乘尾部零的个数,用递归做

public class Test7 {

         publicstatic void main(String[] args) {

                   System.out.println(fun(1000));

         }

 

         publicstatic int fun(int num) {

                   if(num> 0 && num < 5) {

                            return0;

                   }else{

                            returnnum / 5 + fun(num / 5);

                   }

         }

}

 

 

08_集合练习(约瑟夫环)

* 幸运数字

 

public class Test8 {

         publicstatic void main(String[] args) {

                   System.out.println(getLucklyNum(8));

         }

          * 获取幸运数字

          * 1,返回值类型int

          * 2,参数列表int num

         publicstatic int getLucklyNum(int num) {

                   ArrayList<Integer>list = new ArrayList<>();     //创建集合存储1到num的对象

                   for(inti = 1; i <= num; i++) {

                            list.add(i);                  //将1到num存储在集合中

                   }

                  

                   intcount = 1;             //用来数数的,只要是3的倍数就杀人

                   for(inti = 0; list.size() != 1; i++) {               //只要集合中人数超过1,就要不断的杀

                            if(i== list.size()) {               //如果i增长到集合最大的索引+1时

                                     i= 0;                   //重新归零

                            }

                           

                            if(count% 3 == 0) {     //如果是3的倍数

                                     list.remove(i--);        //就杀人

                            }

                            count++;

                   }

                  

                   returnlist.get(0);

         }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值