键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数 注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合

        最近学到map集合,而我map集合又不太会用,总觉得有点反人类。后来做了这道题,才渐渐有了点头绪。最开始有思路,但是在判断map中此时是否有后缀为str[1]的文件,如果没有即map.get(str[1]) == null 为空这里有点卡壳,之前一直没想到用判空来进行操作,所以一直没有做出来。还有一步是分割字符串时,如果直接用"."来分割的话,会报错。但是换成了"\\."之后就没问题了,这里我还是不太懂,新手小白,格式规范可能不太好,请大佬们多提宝贵意见。

 

import java.io.File;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

/**
 * 
 * @version 1.00 2019年8月11日
 * @author MrSYH 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数
 *         注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key,
 *         用个数作为value,放入到map集合中,并用两种方式遍历map集合 例如:doc 的类型的文件有 3 个;
 *         java 的类型的文件有 5个;
 *         txt 的类型的文件有 7 个;
 */
public class Test {

    public static void main(String[] args) {
        
        HashMap<String, Integer> map = new HashMap<String, Integer>();//创建map集合来存放文件类型和数量
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入路径:");
        String path = sc.nextLine();
        File f1 = new File(path);//f1得到文件路径
        
        //先判断是否存在,并且是文件夹
        if (f1.isDirectory() && f1.exists()) {
            sumFile(f1,map);
        } else {
            System.out.println("输入路径有误");
        }
    }

    /**
     * Method name: sumFile <BR>
     * Description: 统计文件类型 <BR>
     * Remark: <BR>
     * 
     * @param f1
     *            void<BR>
     * @param map 
     */
    private static void sumFile(File f1, HashMap<String,Integer> map) {
                
        String[] str = new String[2];    //用一个字符串数组来存放得到的文件的名字以及后缀
        File[] flist = f1.listFiles();    //捞文件夹里的文件
        for (File file : flist) {    //增强for循环来得到文件夹里的文件
            
            if (file.isFile()) {//判断是否为文件,不是的话进入else代码块
                String name = file.getName();
                str = name.split("\\.");//劈开文件名,数组中此时str[0]存放的为文件名字,str[1]存放的为文件后缀
                
                if (map.get(str[1]) == null) {//判断map中此时是否有后缀为str[1]的文件,如果没有即map.get(str[1]) == null 为空
                    map.put(str[1], 1);//在map中添加键和值,分别为str[1]和1   表明此时后缀为str[1]的文件有1个
                } else {
                    map.put(str[1], map.get(str[1]) + 1);//否则的话说明后缀为str[1]的文件已经存在,所以将它的数量+1
                }
            } else {
                sumFile(file,map);//不是文件,进行递归
            }
        }
        
        //第一种方法,通过keySet()方法来得到所有键的集合进行遍历,得到文件类型数量
        System.out.println("第一种方法");
        Set<String> key = map.keySet();    //得到所有键的集合
        for (String string : key) {//增强for循环,通过上面得到的key的集合来遍历map,得到文件类型数量
            Integer s = map.get(string);
            System.out.println(string + "文件类型有:" + s+"种");
        }
        System.out.println("");
        //第二种方法,通过entrySet()方法得到map键值对对象,输出文件数量
        System.out.println("第二种方法");
        Set<Entry<String,Integer>> entrySet = map.entrySet();
        for (Entry<String, Integer> entry : entrySet) {
            System.out.println(entry.getKey()+"文件类型有:"+entry.getValue()+"种");
        }    
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值