在递归方法内的循环中添加计数器 - Java

时间:2014-01-10 19:22:13

标签: java

我有一个方法,它遍历提供的目录数组并打印出那里的所有音频文件。我想添加一个计数器,以获得从总扫描中找到的所有音频文件。

目前
if(file.isDirectory()){new MusicGetter(path).lookup();}

满足条件并移动到新文件夹,重置总数。

感谢您的帮助:)

完整方法:

public void lookup()
{     
    File folder = new File(c);       
    //File[] listOfFiles = folder.listFiles();
    int count = 0;

    if(folder.listFiles() == null)
    {            
        return;            
    }

    for (File file : folder.listFiles())
    {
        String path = file.getPath();

        //in each directory print out the audio files
        if(path.contains(".mp3") || path.contains(".wav") || path.contains(".flac") || path.contains(".m4a") || path.contains(".ogg") || path.contains(".wma"))
        {
            System.out.println(path);   
            count++;                             
        }            

        //call method again if the file is a directory
        if (file.isDirectory())
        {
            new MusicGetter(path).lookup();               
        }           
    }        
    System.out.println("count is" + count);        
}

4 个答案:

答案 0 :(得分:2)

我会将方法从void更改为返回类型int并执行以下操作:

 public int lookup()
    {     
        File folder = new File(c);       
        //File[] listOfFiles = folder.listFiles();
        int count = 0;

        if(folder.listFiles() == null)
        {            
            return count;            
        }

        for (File file : folder.listFiles())
        {
            String path = file.getPath();

            //in each directory print out the audio files
            if(path.contains(".mp3") || path.contains(".wav") || path.contains(".flac") || path.contains(".m4a") || path.contains(".ogg") || path.contains(".wma"))
            {
                System.out.println(path);   
                count++;                             
            }            

            //call method again if the file is a directory
            if (file.isDirectory())
            {
                count += new MusicGetter(path).lookup();               
            }           
        }
        return count;     
        System.out.println("count is" + count);        
    }

答案 1 :(得分:0)

您需要将计数存储在对象中并通过方法调用传递对象,以便您可以更新其中的计数,或者您需要将计数存储在某个成员变量中。请注意,在第二种情况下,您冒着代码不可重入的风险,因为同时两个计数会干扰彼此的结果。

答案 2 :(得分:0)

不要创建新的MusicGetter - 将其更改为.lookup(File file);并将其传递给该文件。

为什么要将文件转换为字符串路径呢?

修改

这就是我的意思:

public class MusicGetter {

    private final File root;
    private int count = 0;

    public MusicGetter(File root) {
        this.root = root;
    }

    public void lookup() {
        lookup(root);
        System.out.println("count is: " + count);
    }

    private void lookup(File folder) {

        if (folder == null)
            return;

        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                lookup(file);
            } else if (file.getName().matches(".*\\.(mp3|wav|flac|m4a|ogg|wma)$")) {
                System.out.println(file);
                count++;
            }
        }
    }

}

答案 3 :(得分:0)

将返回值从void更改为int,如下所示:

public int lookup()

当你调用递归部分时,请执行以下操作:

count += new MusicGetter(path).lookup();

因此,在每个文件后添加计数,并在递归部分返回计数。