一、统计文件夹大小(递归)
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、获取该文件夹下的所有文件和文件夹listFiles
File[] 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()){ //增长到集合最大索引时,重新归0
i = 0;
}
if(count % 3 == 0){ //3的倍数,移走
list.remove(i);
i--;
}
count ++;
}
System.out.println("移走" + count + "次");
return list.get(0);
}
}