2014-02-20 3 views
4

В настоящее время я пытаюсь написать программу, которая проходит через текстовый файл, чтобы найти первое слово длиной более 9 символов.Как найти первую строку в текстовом файле с определенной длиной?

Я думал, что сначала мне нужно получить полное слово, поэтому для этого я должен использовать цикл for для итерации по каждому элементу в файле, добавляя его как переменную currentWord.

Во-вторых, получив это слово/String, я бы сделал второй шаг - чтобы сравнить его длину с целью («THRESHOLD») длиной 9. Если бы это было больше, то я нашел первый слово длины, большее или равное 10, и вернет это в предложение. В противном случае цикл продолжил бы итерацию?

Вот то, что я до сих пор:

// Write a program that finds the first word in Alice In Wonderland 
// that is longer than a given number of characters. 

import java.util.Scanner; 
import java.io.FileReader; 
import java.io.FileNotFoundException; 

public class LearningLoops { 
public static void main(String[] args) throws java.io.FileNotFoundException 
    { 
     Scanner in = new Scanner(new FileReader("aliceInWonderland.txt")); 
    String longWord = ""; 
    boolean found = false; 
    final int THRESHOLD = 9; 
    int i; 
    String currentWord; 

    for (i = 0; in.charAt(i) != " "; i++) { 
     currentWord = currentWord + i; 
     i++; 
    } 

    while (in != null) { 
     if (currentWord.length() > THRESHOLD) { 
      longWord = currentWord; 
     } 
    System.out.println("The first long word is: " + longWord);  
     } 
    } 
} 

Является ли это правильный подход? Я застрял и поэтому буду благодарен за любую помощь.

+1

in.charAt (я) = "" неправильно .. – TheLostMind

+0

тестирование ли вы свой подход? Если нет, почему бы и нет? Действительно, работает ли это? В противном случае, какую ошибку он дает, или дать пример ввода вместе с ожидаемым и фактическим выходом, и предпочтительно отлаживать код, чтобы найти или, по крайней мере, сузить проблему. – Dukeling

+0

Правильный подход должен включать передачу имени файла, который вы будете читать программе, в качестве аргумента командной строки. – unigeek

ответ

3

Очень простое решение было бы что-то вроде этого:

BufferedReader br = new BufferedReader(new FileReader("aliceInWonderland.txt")); 
String line; 
while ((line = br.readLine()) != null) { 
    String[] words = line.split(" "); 
    for (String word : words) { 
     if (word.length() >= 9) { 
      return word; 
     } 
    } 
} 
1

Измените свой подход. У:

  1. Используйте FileReader/Scanner и/или BufferdReader прочитать файл построчно.
  2. trim() Каждая строка считывается из файла.
  3. Теперь разделите линию на основе пробелов - \\s+.
  4. Итерации через массив, для каждого String в массиве split, проверьте длину. Если порог длины>, добавьте String в массив List /. если нет, ничего не делайте.
  5. Сделайте это для всех строк текстового файла.
0

У вас есть две петли; один for цикл и один while петля.

Это не редкость выполнять задачу в двух циклах - возможно, один раз цикл для сбора информации, а затем другой для обработки этой информации. Однако задача, которую вы пытаетесь сделать, может быть выполнена в одном цикле.

Подумайте о том, как вы могли бы сделать это вручную:

  1. Считывает слово
  2. Если слово соответствует вашим потребностям, остановить и сообщить слово.
  3. В противном случае перейдите к шагу 1

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

Это петля. На самом деле это цикл while - вы возвращаетесь на первый шаг , а вы не нашли подходящего слова.

while(word.length < TARGET_LENGTH) { 
    word = ... // get next word 
} 

Похоже, вы знаете, что Scanner может быть полезным, но хотя вы создаете один, вы никогда не использовать его. Read the documentation for Scanner, и некоторые методы, имеющие отношение к проблеме, выйдут на вас. Возможно, вам стоит попробовать написать программу, которая печатает первое слово или первые два слова, прежде чем перейти к решению цикла.

0

Вы неправильно используете объект Scanner. Он сканирует поиск данных для токенов (см. Его API)

Здесь у вас есть пример использования сканера, но есть другие варианты, как показывают другие ответы (разделение строк на слова). Я не хотел, чтобы генерировать так много объектов String, но это вопрос или мнение)

public static void main(String[] args) throws java.io.FileNotFoundException { 

    Scanner in = new Scanner(new FileReader("aliceInWonderland.txt")); 
    in.useDelimiter("^\\w"); //any character which is not a letter or number or _ 
    while (in.hasNext()) { 
     String s=in.next(); 
     if (s.length>=9) { 
      System.out.println("The first long word is: " +s); 
      break; 
     } 
    } 
} 
0

Я бы пойти на BufferedReader, прочитать файл построчно, разделить линии на непечатаемых и возвращает первый маркер что соответствует условию.

public static void main(String[] args) throws FileNotFoundException, IOException { 
    File file = new File("aliceInWonderland.txt"); 
    int threshold = 9; 

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
    String line; 

    while ((line = br.readLine()) != null) { 
     String[] tokens = line.split("\\s+"); 
     for (String token : tokens) { 
      if (token.length() > threshold) { 
       System.out.println("The first long word is: " + token); 
       return; 
      } 
     } 
    } 
    br.close(); 
} 
0

Вы можете использовать класс BufferedReader для улучшения performance.Do как это:

public static String getLongest() throws IOException{ 
    BufferedReader reader = new BufferedReader(new FileReader("aliceInWonderland.txt")); 
    final int THRESHOLD = 9; 
    String line = ""; 
    while((line = reader.readLine()) != null) { 
     String[] arr = line.split("\\s+"); 
     for(String word: arr) { 
      System.out.println(word); 
      if(word.length() > THRESHOLD) { 
       return word; 
      } 
     } 
    } 
    return null; 
} 
+0

Возможно, OP должен получить зависть от основной логики программы, прежде чем беспокоиться о производительности. – slim

Смежные вопросы