###23.01_File類遞歸練習(統計該文件夾大小)
* 需求:1,從鍵盤接收一個文件夾路徑,統計該文件夾大小
package com.heima.test;
import java.io.File;
import java.util.Scanner;
public class Test1 {
/**
* @param args
* 需求:1,從鍵盤接收一個文件夾路徑,統計該文件夾大小
*
* 從鍵盤接收一個文件夾路徑
* 1,創建鍵盤錄入對象
* 2,定義一個無限循環
* 3,將鍵盤錄入的結果存儲並封裝成File對象
* 4,對File對象判斷
* 5,將文件夾路徑對象返回
*
* 統計該文件夾大小
* 1,定義一個求和變量
* 2,獲取該文件夾下所有的文件和文件夾listFiles();
* 3,遍歷數組
* 4,判斷是文件就計算大小並累加
* 5,判斷是文件夾,遞歸調用
*/
public static void main(String[] args) {
//File dir = new File("F:\\day06");
//System.out.println(dir.length()); //直接獲取文件夾的結果是0
File dir = getDir();
System.out.println(getFileLength(dir));
}
/*
* 從鍵盤接收一個文件夾路徑
* 1,返回值類型File
* 2,參數列表無
*/
public static File getDir() {
//1,創建鍵盤錄入對象
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個文件夾路徑:");
//2,定義一個無限循環
while(true) {
//3,將鍵盤錄入的結果存儲並封裝成File對象
String line = sc.nextLine();
File dir = new File(line);
//4,對File對象判斷
if(!dir.exists()) {
System.out.println("您錄入的文件夾路徑不存在,請輸入一個文件夾路徑:");
}else if(dir.isFile()) {
System.out.println("您錄入的是文件路徑,請輸入一個文件夾路徑:");
}else {
//5,將文件夾路徑對象返回
return dir;
}
}
}
/*
* 統計該文件夾大小
* 1,返回值類型long
* 2,參數列表File dir
*/
public static long getFileLength(File dir) { //dir = F:\day06\day07
//1,定義一個求和變量
long len = 0;
//2,獲取該文件夾下所有的文件和文件夾listFiles();
File[] subFiles = dir.listFiles(); //day07 Demo1_Student.class Demo1_Student.java
//3,遍歷數組
for (File subFile : subFiles) {
//4,判斷是文件就計算大小並累加
if(subFile.isFile()) {
len = len + subFile.length();
//5,判斷是文件夾,遞歸調用
}else {
len = len + getFileLength(subFile);
}
}
return len;
}
}
###23.02_File類遞歸練習(刪除該文件夾)
* 需求:2,從鍵盤接收一個文件夾路徑,刪除該文件夾
package com.heima.test;
import java.io.File;
public class Test2 {
/**
* 需求:2,從鍵盤接收一個文件夾路徑,刪除該文件夾
*
* 刪除該文件夾
* 分析:
* 1,獲取該文件夾下的所有的文件和文件夾
* 2,遍歷數組
* 3,判斷是文件直接刪除
* 4,如果是文件夾,遞歸調用
* 5,循環結束後,把空文件夾刪掉
*/
public static void main(String[] args) {
File dir = Test1.getDir(); //獲取文件夾路徑
deleteFile(dir);
}
/*
* 刪除該文件夾
* 1,返回值類型 void
* 2,參數列表File dir
*/
public static 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();
}
}
###23.03_File類遞歸練習(拷貝)
* 需求:3,從鍵盤接收兩個文件夾路徑,把其中一個文件夾中(包含內容)拷貝到另一個文件夾中
package com.heima.test;
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 Test3 {
/**
* 需求:3,從鍵盤接收兩個文件夾路徑,把其中一個文件夾中(包含內容)拷貝到另一個文件夾中
*
* 把其中一個文件夾中(包含內容)拷貝到另一個文件夾中
* 分析:
* 1,在目標文件夾中創建原文件夾
* 2,獲取原文件夾中所有的文件和文件夾,存儲在File數組中
* 3,遍歷數組
* 4,如果是文件就用io流讀寫
* 5,如果是文件夾就遞歸調用
* @throws IOException
*/
public static void main(String[] args) throws IOException {
File src = Test1.getDir();
File dest = Test1.getDir();
if(src.equals(dest)) {
System.out.println("目標文件夾是源文件夾的子文件夾");
}else {
copy(src,dest);
}
}
/*
* 把其中一個文件夾中(包含內容)拷貝到另一個文件夾中
* 1,返回值類型void
* 2,參數列表File src,File dest
*/
public static void copy(File src, File dest) throws IOException {
//1,在目標文件夾中創建原文件夾
File newDir = new File(dest, src.getName());
newDir.mkdir();
//2,獲取原文件夾中所有的文件和文件夾,存儲在File數組中
File[] subFiles = src.listFiles();
//3,遍歷數組
for (File subFile : subFiles) {
//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);
}
}
}
}
###23.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
package com.heima.test;
import java.io.File;
public class Test4 {
/**
* 需求:4,從鍵盤接收一個文件夾路徑,把文件夾中的所有文件以及文件夾的名字按層級打印, 例如:
* 把文件夾中的所有文件以及文件夾的名字按層級打印
* 分析:
* 1,獲取所有文件和文件夾,返回的File數組
* 2,遍歷數組
* 3,無論是文件還是文件夾,都需要直接打印
* 4,如果是文件夾,遞歸調用
* day07
* day08
* xxx.jpg
* yyy.txt
* Demo1_Consturctor.class
* Demo1_Consturctor.java
* Demo1_Student.class
* Demo1_Student.java
*/
public static void main(String[] args) {
File dir = Test1.getDir(); //獲取文件夾路徑
printLev(dir,0);
}
public static void printLev(File dir,int lev) {
//1,把文件夾中的所有文件以及文件夾的名字按層級打印
File[] subFiles = dir.listFiles();
//2,遍歷數組
for (File subFile : subFiles) {
for(int i = 0; i <= lev; i++) {
System.out.print("\t");
}
//3,無論是文件還是文件夾,都需要直接打印
System.out.println(subFile);
//4,如果是文件夾,遞歸調用
if(subFile.isDirectory()) {
//printLev(subFile,lev + 1);
printLev(subFile,++lev);
}
}
}
}
###23.05_遞歸練習(斐波那契數列)
* 不死神兔
* 故事得從西元1202年說起,話說有一位意大利青年,名叫斐波那契。
* 在他的一部著作中提出了一個有趣的問題:假設一對剛出生的小兔一個月後就能長成大兔,再過一個月就能生下一對小兔,並且此後每個月都生一對小兔,一年內沒有發生死亡,
* 問:一對剛出生的兔子,一年內繁殖成多少對兔子?
* 1 1 2 3 5 8 13
* 第一個月一對小兔子 1
* 第二個月一對大兔子 1
* 第三個月一對大兔子生了一對小兔子 2
* 第四個月一對大兔子生了一對小兔子
* 一對小兔子長成大兔子 3
* 第五個月兩對大兔子生兩對小兔子
* 一對小兔子長成大兔子 5
package com.heima.test;
public class Test5 {
/**
* * 不死神兔
* 故事得從西元1202年說起,話說有一位意大利青年,名叫斐波那契。
* 在他的一部著作中提出了一個有趣的問題:假設一對剛出生的小兔一個月後就能長成大兔,再過一個月就能生下一對小兔,並且此後每個月都生一對小兔,一年內沒有發生死亡,
* 問:一對剛出生的兔子,一年內繁殖成多少對兔子?
* 1 1 2 3 5 8 13 21
* 1 = fun(1)
* 1 = fun(2)
* 2 = fun(1) + fun(2)
* 3 = fun(2) + fun(3)
*/
public static void main(String[] args) {
//demo1();
System.out.println(fun(8));
}
public static void demo1() {
//用數組做不死神兔
int[] arr = new int[8];
//數組中第一個元素和第二個元素都爲1
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]);
}
/*
* 用遞歸求斐波那契數列
*/
public static int fun(int num) {
if(num == 1 || num == 2) {
return 1;
}else {
return fun(num - 2) + fun(num - 1);
}
}
}
###23.06_遞歸練習(1000的階乘所有零和尾部零的個數)
* 需求:求出1000的階乘所有零和尾部零的個數,不用遞歸做
package com.heima.test;
import java.math.BigInteger;
public class Test6 {
/**
* @param args
* 需求:求出1000的階乘所有零和尾部零的個數,不用遞歸做
*/
public static void main(String[] args) {
/*int result = 1;
for(int i = 1; i <= 1000; i++) {
result = result * i;
}
System.out.println(result); //因爲1000的階乘遠遠超出了int的取值範圍
*/
//demo1();
demo2();
}
public static void demo2() { //獲取1000的階乘尾部有多少個零
BigInteger bi1 = new BigInteger("1");
for(int i = 1; i <= 1000; i++) {
BigInteger bi2 = new BigInteger(i+"");
bi1 = bi1.multiply(bi2); //將bi1與bi2相乘的結果賦值給bi1
}
String str = bi1.toString(); //獲取字符串表現形式
StringBuilder sb = new StringBuilder(str);
str = sb.reverse().toString(); //鏈式編程
int count = 0; //定義計數器
for(int i = 0; i < str.length(); i++) {
if('0' != str.charAt(i)) {
break;
}else {
count++;
}
}
System.out.println(count);
}
public static void demo1() { //求1000的階乘中所有的零
BigInteger bi1 = new BigInteger("1");
for(int i = 1; i <= 1000; i++) {
BigInteger bi2 = new BigInteger(i+"");
bi1 = bi1.multiply(bi2); //將bi1與bi2相乘的結果賦值給bi1
}
String str = bi1.toString(); //獲取字符串表現形式
int count = 0;
for(int i = 0; i < str.length(); i++) {
if('0' == str.charAt(i)) { //如果字符串中出現了0字符
count++; //計數器加1
}
}
System.out.println(count);
}
}
###23.07_遞歸練習(1000的階乘尾部零的個數)
* 需求:求出1000的階乘尾部零的個數,用遞歸做
package com.heima.test;
public class Test7 {
/**
* @param args
* 需求:求出1000的階乘尾部零的個數,用遞歸做
* 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100...1000 1000 / 5 = 200
* 5 * 5 5 * 5 * 2 5 * 5 * 3 5 * 5 * 4 5 * 5 * 5 5 * 5 * 6 200 / 5 = 40
* 5 * 5 * 5 * 1 5 * 5 * 5 * 2 5 * 5 * 5 * 3 5 * 5 * 5 * 4 5 * 5 * 5 * 5 5 * 5 * 5 * 6 5 * 5 * 5 * 7 5 * 5 * 5 * 8
40 / 5 = 8
5 * 5 * 5 * 5 8 / 5 = 1
*/
public static void main(String[] args) {
System.out.println(fun(1000));
}
public static int fun(int num) {
if(num > 0 && num < 5) {
return 0;
}else {
return num / 5 + fun(num / 5);
}
}
}
###23.08_集合練習(約瑟夫環)
* 幸運數字
package com.heima.test;
import java.util.ArrayList;
public class Test8 {
/**
* @param args
* 約瑟夫環
* * 幸運數字
*/
public static void main(String[] args) {
System.out.println(getLucklyNum(8));
}
/*
* 獲取幸運數字
* 1,返回值類型int
* 2,參數列表int num
*/
public static int getLucklyNum(int num) {
ArrayList<Integer> list = new ArrayList<>(); //創建集合存儲1到num的對象
for(int i = 1; i <= num; i++) {
list.add(i); //將1到num存儲在集合中
}
int count = 1; //用來數數的,只要是3的倍數就殺人
for(int i = 0; list.size() != 1; i++) { //只要集合中人數超過1,就要不斷的殺
if(i == list.size()) { //如果i增長到集合最大的索引+1時
i = 0; //重新歸零
}
if(count % 3 == 0) { //如果是3的倍數
list.remove(i--); //就殺人
}
count++;
}
return list.get(0);
}
}