下面的代码是程序的一部分,该程序将查找文本文件中输入字符的出现次数
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
方法中使用catch
和rec
来捕获IOException
吗?
预先感谢
P.S。该程序来自分配,我必须使用递归并将其与迭代进行比较。
答案 0 :(得分:0)
我的建议如下:
答案 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();
}