使用递归查找特定字符的出现次数

时间:2018-09-25 08:57:58

标签: java recursion return try-catch

下面的代码是程序的一部分,该程序将查找文本文件中输入字符的出现次数

public static void main(String[] args){
    [...]
    java.io.File file1=new java.io.File(dirPath1);
    FileInputStream fis = new FileInputStream(file1);
    System.out.println("  return "+rec(sc.next().charAt(0),fis));
}



public static int rec (char ch, FileInputStream fis)throws IOException{
    char current=0;
    if(fis.available()==0){
        return 0;
    }
    if(fis.read()!=-1){
        current = (char) fis.read();
    }

    if(current==ch) {     
        return 1+rec(ch,fis);
    }else
        return rec(ch,fis);
    }
} 

问题是:

如果文件有一个字符,并且ch =那个字符。当我跟踪代码时发现它没有输入if(current==ch),它返回0。虽然,它们是相同的字符。

如果字符多于字符串,则其中的一些字符串(匹配的字符)将输入if block,而其他字符则不输入。 我该如何解决?

是否有另一种方式递归查找发生次数?

另一个问题:我应该在try方法中使用catchrec来捕获IOException吗?

预先感谢

P.S。该程序来自分配,我必须使用递归并将其与迭代进行比较。

3 个答案:

答案 0 :(得分:0)

我的建议如下:

  1. 将整个文本文件读取到java.lang.String
  2. 然后使用库Apache Commons Lang并使用此方法对事件进行计数: http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#countMatches-java.lang.CharSequence-java.lang.CharSequence-

答案 1 :(得分:0)

您调用fis.read()两次,第一个读取第一个字符,第二个不读取

这是你的答案

public static int rec(char ch, FileInputStream fis) throws IOException {

    char current = 0;
    if (fis.available() == 0) {
        return 0;
    }
    int read = fis.read();
    if (read != -1) {
        current = (char) read;
    }

    if (current == ch) {

        return 1 + rec(ch, fis);
    }

    else
        return rec(ch, fis);

}

答案 2 :(得分:0)

您应该使用FileReader从文本文件读取字符。

Reader reader = new FileReader("MyFile.txt");

我认为使用while ((i=reader.read()) != -1)会比使用三个if和一个else更好。

因此您可以用更少的代码行来实现:

public static int rec (char ch, Reader reader)throws IOException{
    char current=0;
    int i; 
    while ((i=reader.read()) != -1) {
        current = (char) i;
        if(current==ch) {     
            return 1+rec(ch,reader);
        }else
            return rec(ch,reader);
    }
    return 0;  
} 

我认为不需要在try方法中使用try和catch来捕获IOException。我在这里用过:

    try {
        Reader reader = new FileReader("MyFile.txt");
        System.out.println("  return " + rec('a', reader));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }