递归实战篇:查询商品分类的实现

引言

之前我写了一篇关于递归的博客,反响还不错,链接如下:
递归和循环之间不得不说的故事:https://blog.csdn.net/Qizhi_Hu/article/details/104395547,
然后不久有朋友问了我个关于递归的问题,其实具体实现逻辑和我上次写的博客举的最后一个例子是一样的。

问题如图,以哲学分类为例,使哲学为父节点,通过点击哲学,获取父节点下的所有子节点,包括子节点的子节点,子节点的子节点的子节点…
递归实战篇:查询商品分类的实现_第1张图片
可能有朋友会问,先获取哲学下的所有子结点,然后再获取中国哲学下的子节点不就成了,这不是很简单?但是这只是以哲学为父节点举的一个栗子,父节点可以是中国哲学,也可以是小说嘛。真实情况往往很复杂,而且多变,万一欧洲哲学下再添加新的子节点,代码就不适用了,毕竟要实现代码复用嘛,所以还是要靠递归的。

经过帮朋友一番捣鼓,实现的效果图如下:

递归实战篇:查询商品分类的实现_第2张图片
其实原理很简单:获取父节点下所有子节点,若是子节点下还有子节点,则继续遍历获取。至于具体代码,一来因为朋友项目里的代码不方便透露,二则项目里有很多接口,封装的方法,若是直接披露核心代码,难免让人云里雾里;若是全部贴出来,那未免也太冗长了。但是没关系,为此我特意用文件夹来模拟实现这个功能(代码虽然不一样,但逻辑是一样的)

开整

1.先在电脑C盘下新建一个名为"哲学"的文件夹,再在"哲学"文件夹下面新建五个命名分别为"非洲哲学"、“美洲哲学”、“欧洲哲学”、"世界哲学"和"中国哲学"的文件夹。
递归实战篇:查询商品分类的实现_第3张图片
2.再在"中国哲学"文件夹下,新建一个名为"江西哲学"的文件夹。
递归实战篇:查询商品分类的实现_第4张图片
3.代码如下:

/**
 * @author guqueyue
 * @Date 2020/2/28
 * 获得父文件下的所有的文件名
 **/
public class AllFiles {
    public static void main(String[] args) {
        // 创建集合,存放文件名
        List<String> filesList = new ArrayList<>();
        // 获得文件对象
        File file = new File("C:\\哲学");
        // 递归获得父文件下的所有的文件名
        allFiles(filesList, file);
        // 输出获取的文件夹名。当然,在具体项目中,一般获取的是id字段
        System.out.println(filesList);
    }

    private static void allFiles(List<String> filesList, File file) {
        // 获取当前文件夹下的抽象路径名数组
        File[] fileList = file.listFiles();
        for (File f : fileList) {
            if (f.listFiles().length == 0) // 递归出口:如果当前文件夹没有子文件夹,直接添加即可
                filesList.add(f.getName());
            else // 继续递归
                allFiles(filesList, f);
        }

        //如果递归过程中,文件夹下没有子文件夹,则不会进入循环,到这里添加文件名进集合
        filesList.add(file.getName());
    }
}

4.控制台输出如下:
递归实战篇:查询商品分类的实现_第5张图片

答疑解惑

1.若还是看不明白,不妨分别打印出当前的文件夹下的子文件夹以及添加文件夹名时的文件夹名(为了以示区分,打印第二个文件夹名我用了红色的错误输出流)。
递归实战篇:查询商品分类的实现_第6张图片
2.控制台输出如下图,程序先找出哲学的所有子节点,一个一个遍历,若子节点下还有子节点则继续获取所有子节点,一个一个遍历;若子节点下无子节点,则直接添加,而父节点则都交由最后的添加语句进行添加:
递归实战篇:查询商品分类的实现_第7张图片

你可能感兴趣的:(JavaSE,算法)