2014-12-14 2 views
1

ниже - мой код для домашнего задания, где мне нужно прочитать содержимое внешнего файла и определить количество слов внутри него, количество трехбуквенных слов и процент от общего количества. У меня есть эта часть, просто отлично, но я также должен распечатать содержимое внешнего файла до отображения вышеуказанной информации. Ниже мой текущий код:Печать содержимого внешнего файла

public class Prog512h 
{ 
    public static void main(String[] args) 
    { 
    int countsOf3 = 0; 
    int countWords = 0; 

    DecimalFormat round = new DecimalFormat("##.00"); // will round final value to two decimal places 

    Scanner poem = null; 
    try 
    { 
     poem = new Scanner (new File("prog512h.dat.txt")); 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.println ("File not found!"); // returns error if file is not found 
     System.exit (0); 
    } 

    while (poem.hasNext()) 
    { 
     String s = poem.nextLine(); 
     String[] words = s.split(" "); 
     countWords += words.length; 
     for (int i = 0; i < words.length; i++) 
     { 
      countsOf3 += words[i].length() == 3 ? 1 : 0; // checks for 3-letter words 
     } 
    } 

    while(poem.hasNext()) 
    {  
     System.out.println(poem.nextLine()); 
    } 
    System.out.println(); 
    System.out.println("Number of words: " + countWords); 
    System.out.println("Number of 3-letter words: " + countsOf3); 
    System.out.println("Percentage of total: " + round.format((double)((double)countsOf3/(double)countWords) * 100.0)); // converts value to double and calculates percentage by dividing from total number of words 
    } 

    } 

Заявление

while(poem.hasNext()) 
{  
    System.out.println(poem.nextLine()); 
} 

предполагается печатать содержимое внешнего файла. Однако это не так. Когда я пытаюсь переместить его перед моим предыдущим циклом while, он печатает, но прижимает мои напечатанные значения к # словам, 3-буквенным словам, проценту и т. Д. Я не совсем уверен, в чем проблема. Может ли кто-нибудь помочь?

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

+0

Благодарим за предложение! Я просто попытался реализовать его без везения. Содержимое по-прежнему не печатается. :( – Blackout621

ответ

1

Ваш сканер пытается перечитать файл, но он находится внизу, поэтому больше нет строк для чтения. У вас есть два варианта:

Вариант 1

Создать новый Scanner объект для того же файла (чтобы начать с самого начала снова), а затем вызвать ваш while петлю на этот файл (работ, но не отличный дизайн) ,

Scanner poem2 = null; 
try 
{ 
    poem2 = new Scanner (new File("prog512h.dat.txt")); 
} 
catch (FileNotFoundException e) 
{ 
    System.out.println ("File not found!"); // returns error if file is not found 
    System.exit (0); 
} 

while(poem2.hasNext()) 
{  
    System.out.println(poem2.nextLine()); 
} 

Вариант 2

Лучшим вариантом будет показывать каждую строку, как вы читаете его в этом может быть достигнуто путем добавления дополнительной линии к уже существующей while цикла:.

while (poem.hasNext()) 
{ 
    String s = poem.nextLine(); 
    System.out.println(s); // <<< Display each line as you process it 
    String[] words = s.split(" "); 
    countWords += words.length; 
    for (int i = 0; i < words.length; i++) 
    { 
     countsOf3 += words[i].length() == 3 ? 1 : 0; // checks for 3-letter words 
    } 
} 

Для этого требуется только один объект Scanner, и для этого требуется только один прогон файла, который намного эффективнее.

+0

Насколько бы я хотел вернуться и не переделать свой код, ограничения времени не позволяют сделать это до того, как будет выполнено задание. Я пробовал вариант один, и он сделал трюк, надеюсь, что смогу вернуться и повторить мой код для – Blackout621

+1

@ Blackout621 Второй вариант на самом деле, вероятно, быстрее реализовать, чем первый. Просто звучало более устрашающе. Посмотрите, как это намного лучше. – carloabelli

+0

О, это намного проще, чем Я подумал, что это будет. Я буду использовать это вместо этого. Спасибо еще раз. :) – Blackout621

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