найти количество вхождений для конкретного символа с помощью рекурсии - PullRequest
0 голосов
/ 25 сентября 2018

Этот код ниже является частью программы, которая найдет количество вхождений входного символа в текстовом файле

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 = этот один символ.он возвращает 0, когда я проследил код, я обнаружил, что он не вводит if(current==ch).Несмотря на то, что они являются одним и тем же символом.

, если число символов больше одного, строки некоторых из них - символы совпадения - будут вводить if block, а другие - нет.Как я могу это исправить?

Есть ли другой способ узнать количество вхождений рекурсивно ?

еще один вопрос: я должен использовать try и catch вrec метод для отлова IOException?

Заранее спасибо

PS Эта программа из задания, я должен использовать рекурсию и сравнить ее с итерацией.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Вы вызываете 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);

}
0 голосов
/ 25 сентября 2018

Вы должны использовать 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 и catch в rec для перехвата 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();
    }
0 голосов
/ 25 сентября 2018

Мое предложение будет следующим:

  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-
...