Java--递归、字节流和集合综合

来源:互联网 发布:wind10网络重置 编辑:程序博客网 时间:2024/06/07 01:51

一、统计文件夹大小(递归)

import java.io.File;import java.util.Scanner;public class DiguiTest {public static void main(String[] args) {/* * 从键盘接收一个文件夹路径,统计该文件夹大小 *  * 从键盘接收一个文件夹路径 * 1、创建一个键盘输入对象 * 2、定义一个无线循环 * 3、将输入的字符串路径封装成File对象 * 4、判断文件夹路径是否存在,判断是否为文件夹路径 * 5、返回这个文件夹路径 *  * 统计该文件夹大小 * 1、定义一个long接收字节大小 * 2、获取该文件夹下的所有文件和文件夹listFiles * 3、遍历该文件夹数组 * 4、是文件记录文件大小并累加 * 5、是文件夹实现递归调用 * */File dir = getFir();System.out.println(dirSize(dir));//System.out.println(dir.length());   //不能直接获取文件夹大小结果}//从键盘接收一个文件夹路径public static File getFir() { //1、创建一个键盘输入对象Scanner sc = new Scanner(System.in);System.out.println("请输入一个文件夹路径:"); //2、定义一个无线循环while(true){String line = sc.nextLine();//3、将输入的字符串路径封装成File对象File dir = new File(line);//4、判断文件夹路径是否存在,判断是否为文件夹路径if(!dir.exists()){System.out.println("您输入的文件夹路径不存在,请重新输入一个文件夹路径:");}else if(dir.isFile()){System.out.println("您输入的是一个文件路径,请输入一个文件夹路径:");}else{//5、返回这个文件夹路径return dir;}}}//统计该文件夹大小public static long dirSize(File dir) {//1、定义一个long接收字节大小long length = 0;//2、获取该文件夹下的所有文件和文件夹listFilesFile[] subFiles = dir.listFiles();//3、遍历该文件夹数组for (File subFile : subFiles) {//4、是文件记录文件大小并累加if(subFile.isFile()){length = length + subFile.length();}else{//5、是文件夹实现递归调用length = length + dirSize(subFile);}}return length;}}

二、删除文件夹(递归)

import java.io.File;public class DiguiTest2 {/*从键盘接收一个文件夹路径,删除该文件夹 *  * 删除该文件夹 * 1、获取该文件夹获取子文件和子文件夹数组 * 2、遍历数组 * 3、文件直接删除 * 4、文件夹递归调用 * 5、循环结束删除该文件夹 * */public static void main(String[] args) {File dir = DiguiTest.getFir();//dir.delete();      //该方法直接删除文件夹无效deleteDir(dir);    //删除之后不走回收站(因此删除重要文件时要特别注意)}public static void deleteDir(File dir) {//1、获取该文件夹获取子文件和子文件夹数组File[] subFiles = dir.listFiles();//2、遍历数组for (File subFile : subFiles) {//3、文件直接删除if(subFile.isFile()){subFile.delete();//4、文件夹递归调用}else{deleteDir(subFile);}}//5、循环结束删除该文件夹dir.delete();}}

三、文件拷贝(递归)

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class DiguiTest3 {/* * 从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 *  * 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 * 1、在目标文件夹下创建源文件夹 * 2、获取源文件夹下的子文件和子文件夹 * 3、遍历源文件数组 * 4、源文件夹下的文件读取(IO流)写到目标文件下 * 5、源文件夹下的文件夹递归 * */public static void main(String[] args) throws IOException {File src = DiguiTest.getFir();File dest = DiguiTest.getFir();if(src.equals(dest)){System.out.println("源文件和目标文件路径相同,请重新输入");}else{copy(src,dest);}}public static void copy(File src, File dest) throws IOException {//1、在目标文件夹下创建源文件夹File newDir = new File(dest,src.getName());newDir.mkdir();//2、获取源文件夹下的子文件和子文件夹File[] srcFiles = src.listFiles();//3、遍历源文件数组for (File subFile : srcFiles) {//4、源文件夹下的文件读取(IO流)写到目标文件下if(subFile.isFile()){BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(newDir, subFile.getName())));int b;while((b = bis.read()) != -1){bos.write(b);}bis.close();bos.close();//5、源文件夹下的文件夹递归}else{copy(subFile,newDir);}}}}

四、层级打印文件夹(递归)

import java.io.File;public class DiguiTest4 {/* * 从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印 *  * 把文件夹中的所有文件以及文件夹的名字按层级打印 * 1、获取该文件夹下的所有文件和文件夹 * 2、遍历数组 * 3、遇到文件和文件夹都打印 * 4、文件夹递归调用 * */public static void main(String[] args) {File dir = DiguiTest.getFir();printDir(dir,0);}public static void printDir(File dir,int level) {File[] subFiles = dir.listFiles();for (File subFile : subFiles) {for(int i = 0;i <= level;i++){System.out.print("\t");}System.out.println(subFile);if(subFile.isDirectory()){printDir(subFile,level+1);}}}}

五、斐波那契数列(递归)

public class DiguiTest5 {/* * 斐波那契数列(前两数之和等于后一个数)* 不死神兔* 西元1202年说起,话说有一位意大利青年,名叫斐波那契。* 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,* 问:一对刚出生的兔子,一年内繁殖成多少对兔子?* 1 1 2 3 5 8 13* 第一个月一对小兔子1* 第二个月一对大兔子1* 第三个月一对大兔子生了一对小兔子2* 第四个月一对大兔子生了一对小兔子*  一对小兔子长成大兔子3* 第五个月两对大兔子生两对小兔子*  一对小兔子长成大兔子5 * */public static void main(String[] args) {method1();//第一种方法通过数组实现System.out.println(fun(10));//第二种方法通过递归实现}//第二种方法通过递归实现public static int fun(int num) {if(num == 1 || num == 2){return 1;}else{return fun(num-2) + fun(num-1);}}//第一种方法通过数组实现public static void method1() {int[] arr = new int[10];arr[0] = 1;arr[1] = 1;for(int i = 2;i < arr.length;i++){arr[i] = arr[i-2] + arr[i-1];}System.out.println(arr[arr.length-1]);}}

六、1000阶乘所有0和尾部0个数(递归)

import java.math.BigInteger;public class DiguiTest6 {public static void main(String[] args) {method1();//非递归System.out.println(method2(1000));;//递归}public static int method2(int num) {if(num > 0 && num < 5){return 0;}else{return num/5 + method2(num/5);}}public static void method1() {BigInteger bi1 = new BigInteger("1");//计算1000阶乘for(int i=1;i<=1000;i++){BigInteger bi2 = new BigInteger(i + "");bi1 = bi1.multiply(bi2);}//统计所有0的个数String str = bi1.toString();int count1 = 0;for(int i=0;i < str.length();i++){if('0' == str.charAt(i)){count1++;}}System.out.println("所有0的个数为:" + count1);//统计尾部0的个数StringBuilder sb = new StringBuilder(str);String str1 = sb.reverse().toString();int count2 = 0;for(int i = 0;i<str1.length();i++){if('0' != str1.charAt(i)){break;}else{count2++;}}System.out.println("尾部0的个数为:" + count2);}}

七、约瑟夫环(集合)

import java.util.ArrayList;public class CollectionTest {//约瑟夫环public static void main(String[] args) {System.out.println(getLucklyNum(8));}public static Integer getLucklyNum(int num) {ArrayList<Integer> list = new ArrayList<>();for (int i = 1;i <= num;i++){list.add(i);}int count = 1;   //数数,只要是3的倍数移走for(int i = 0;list.size() != 1;i++){if(i == list.size()){   //增长到集合最大索引时,重新归0i = 0;} if(count % 3 == 0){    //3的倍数,移走list.remove(i);i--;}count ++;}System.out.println("移走" + count + "次");return list.get(0);}}



1 0
原创粉丝点击