2014-10-21 5 views
1

Я разрабатываю программу, которая читает размер файла txt, количество слов, чисел и символов, которые он содержит, и возможность поиска файла для данной строки.Найдите строку и отобразите номер строки и строку непосредственно?

Например.

текстовый файл имеет

Там когда-то была земля

Это не земля больше не существует.

Эта земля была ...

Если бы я хотел, чтобы искать «землю» это список будет все 3 линии.

Методы я создал для поиска файла и найти строку являются:

public String searchWord(String key) throws Exception { 

    LineNumberReader lnr = new LineNumberReader(new FileReader(f)); 
    String line = null; 
    line = recursiveSearch(lnr.readLine(), key, lnr); 

    return line; 
} 

public String recursiveSearch(String currentLineText, String key, LineNumberReader lnr) 
     throws Exception { 

    if (currentLineText != null) { 
     String lCase = currentLineText.toLowerCase(); 
     if (lCase.contains(key.toLowerCase())) { 

      return ("Line " + lnr.getLineNumber() + ": " + currentLineText 
        + "\n"); 
     } 
    } 
    return recursiveSearch(lnr.readLine(), key, lnr); 
} 

Программа действительно поиск по файлам правильно, так что я должен считать слово для поиска работает правильно. Однако, если бы я набрал «землю», она вернула бы «Когда-то была земля», а не все 3 линии.

Если бы я набрал «дольше», он вернул бы вторую строку правильно. Какие направления вы можете дать мне, чтобы показать все необходимые строки?

EDIT

Я пошел с советами MadProgrammer, и я считаю, что он прав. Вам понадобится список. Однако после того, как я повторил код

public List<String> searchWord(String key) throws Exception { 

    LineNumberReader lnr = new LineNumberReader(new FileReader(f)); 

    return recursiveSearch(lnr.readLine(), key, lnr); 
} 


public List<String> recursiveSearch(String currentLineText, String key, LineNumberReader lnr) 
     throws Exception { 
    List<String> resultList = new ArrayList<String>(); 

    if (currentLineText != null) { 
     String lCase = currentLineText.toLowerCase(); 
     if (lCase.contains(key.toLowerCase())) { 

      String result = ("Line " + lnr.getLineNumber() + ": " + currentLineText 
        + "\n"); 
      resultList.add(result); 
     } 
    } 
    String nextLine = lnr.readLine(); 
    if (nextLine != null) { 
     resultList.addAll(recursiveSearch(nextLine, key, lnr)); 
    } 
    return resultList; 
} 

Испытательный класс появился с ошибкой. Программа не нашла «searchMethod»

f.selectFile(); 

    if (f.exists()) { 
    try { 
     String input = JOptionPane.showInputDialog("Enter a word "); 
     for (String line : searchWord(input)) { 
       display(line); 
     } 

Я, вероятно, нужно переписать часть тестового класса, или искать дополнительный пример списков, чтобы получить лучшее понимание.

EDIT 2

Так что я просто послал два метода в тестовом классе и переименовал их с «Static» Все работает. Я предпочитаю не делать этого, но теперь мне просто нужно, чтобы FileReader выбирал файл по входам пользователя, должен быть легким для меня. Спасибо, парни.

+1

Параметр 'Возвращение ("Линия" + lnr.getLineNumber() + ":" + currentLineText + "\ п");' будет короткое замыкание ваш рекурсивный поиск. Попробуйте добавить результаты в «Список» и верните «Список» в конце метода, убедившись, что вы используете что-то вроде «list.addAll (recursiveSearch (lnr.readLine(), key, lnr)); выберите другие результаты;) – MadProgrammer

+0

загрузите файл во временную таблицу db и используйте SQL для поиска. Затем вы можете повторно использовать данные для других поисков. –

+1

@ScaryWombat На самом деле SQL не нужен здесь. – user1803551

ответ

0

Проблема заключается ваш поиск подпрограмма охранник найти только одно слово ...

return ("Line " + lnr.getLineNumber() + ": " + currentLineText + "\n"); 

остановит дальнейшее выполнение и вернуться к абоненту, никогда не ищет какие-либо новые результаты. Тот факт, что вы только возвращать String другая проблема, как вы никогда не сможете найти более одного String, если вы не намерены объединить результаты

Лучшим решением было бы разрешить метод возвращает массив или List из результаты, добавив каждый результат к List, как он был найден, а затем добавили все результаты, полученные из последующих заглавий, к recursiveSearch, например ...

import java.io.File; 
import java.io.FileReader; 
import java.io.LineNumberReader; 
import java.util.ArrayList; 
import java.util.List; 

public class Test1 { 

    public static void main(String[] args) { 
     try { 
      for (String line : searchWord("land")) { 
       System.out.println(line); 
      } 
     } catch (Exception exp) { 
      exp.printStackTrace(); 
     } 
    } 

    public static List<String> searchWord(String key) throws Exception { 

     LineNumberReader lnr = new LineNumberReader(new FileReader(new File("StuffToRead.txt"))); 

     return recursiveSearch(lnr.readLine(), key, lnr); 
    } 

    public static List<String> recursiveSearch(String currentLineText, String key, LineNumberReader lnr) 
        throws Exception { 

     List<String> results = new ArrayList<String>(25); 
     if (currentLineText != null) { 
      String lCase = currentLineText.toLowerCase(); 
      if (lCase.contains(key.toLowerCase())) { 

       results.add("Line " + lnr.getLineNumber() + ": " + currentLineText); 
      } 
      results.addAll(recursiveSearch(lnr.readLine(), key, lnr)); 
     } 
     return results; 
    } 

} 
+0

Я не вижу возможности использования рекурсивной функции. цикл while был бы точным. –

+0

@ScaryWombat Меня нет, но я полагаю, что OP делает некоторые рекурсивные методы самостоятельного обучения или некоторые такие;) – MadProgrammer

0

Вы возвращаете одну строку из метода recursiveSearch(). Вы должны вернуть список строк. Тогда ваша проблема будет решена.

Что-то вроде ...

public List<String> recursiveSearch(String currentLineText, String key, LineNumberReader lnr) 
     throws Exception { 
    List<String> resultList = new ArrayList<String>(); 
    if (currentLineText != null) { 
     String lCase = currentLineText.toLowerCase(); 
     if (lCase.contains(key.toLowerCase())) { 

      String result = "Line " + lnr.getLineNumber() + ": " + currentLineText + "\n"; 
      resultList.add(result); 
     } 
    } 
    String nextLine = lnr.readLine(); 
    if(nextLine != null) { 
     resultList.addALL(recursiveSearch(nextLine, key, lnr)); 
    } 
    return resultList; 
}