2015-11-25 63 views
0

我必须写我给出了一个具有文本行(或多行)的字符串输入文件,例如:“HIGH HIGH cat high jump(WOW 6SOFT)” 。从这一行开始,我必须扫描文件,计算单词出现的次数(不管大小写),然后将其输出到格式化文件。如果一个数字出现在某个单词之前,则该单词不应被计数。格式必须以三个空格中的计数右对齐开始,然后是另一个空格,然后是以小写字母计数的单词。从文件中计算单词

package InClass; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.PrintWriter; 
import java.util.ArrayList; 
import java.util.Scanner; 


public class CountWords { 
public static void main(String[] args) { 
    try { 
     File inputFile = new File("input.txt"); 
     Scanner scanner = new Scanner(inputFile); 
     File outputFile = new File("output.txt"); 
     PrintWriter writer = new PrintWriter(outputFile); 

     boolean next = scanner.hasNext(); 
     ArrayList<String> inputWords = new ArrayList<String>(); 
     ArrayList<String> outputWords = new ArrayList<String>(); 

     while (next) { // Adds all the strings to an array list 
      inputWords.add(scanner.next()); 
      for (int i = 0; i < inputWords.size(); i++) { 
       inputWords.get(i).toLowerCase(); 
      } 
     } 
     while (next) { 
      for (int i = 0; i < inputWords.size(); i++) { 
       String word = inputWords.get(i); 
       int count = 1; 
       if (!Character.isDigit(word.charAt(0))) { 
        outputWords.add(inputWords.get(i)); 
        if (outputWords.contains(word)) { 
         count++; 
        } 
       } else { 
        inputWords.remove((i)); 
       } 
       for (int j = 0; i < outputWords.size(); j++) { 
        word = outputWords.get(i); 
        writer.printf("%3s" + "%1s\n", count, word); 
       } 
      } 
     } 
     scanner.close(); 
     writer.close(); 
    } catch (FileNotFoundException e) { 
    } 
} 
} 

我的测试文件是给我一个错误说还有专为测试仪类,这是检验两个词的一个一个NoSuchElementException。下面是测试类给人错误”

@Test 
public void testTwoWords() { 
    try { 
     File inputFile = new File(INPUT); 
     File outputFile = new File(OUTPUT); 

     // If assert fails it is (usually) because the file was (wrongly) 
     // left open in an earlier run. 
     // Using a file manager application (e.g. explorer), go to project 
     // directory and delete it. 
     // Make sure that your program closes these files before ending. 
     if (inputFile.exists()) { 
      assertTrue("Your program left \"" + INPUT 
        + "\" open in a previous test.", inputFile.delete()); 
     } 
     if (outputFile.exists()) { 
      assertTrue("Your program left \"" + OUTPUT 
        + "\" open in a previous test.", outputFile.delete()); 
     } 

     // create INPUT file 
     PrintWriter input = new PrintWriter(inputFile); 
     input.println("King"); 
     input.println(""); 
     input.println(""); 
     input.println(""); 
     input.println("hill"); 
     input.close(); 

     // invoke program 
     CountWords.main(null); 

     // verify OUTPUT file exists and is empty 
     assertTrue("Output file doesn't exist", outputFile.exists()); 
     Scanner output = new Scanner(outputFile); 
     String actual = output.nextLine(); 
     assertEquals("Incorrect result", " 1 king", actual); 
     actual = output.nextLine(); 
     assertEquals("Incorrect result", " 1 hill", actual); 
     assertFalse("There should be no more data", output.hasNext()); 
     output.close(); 

     // delete I/O files 
     assertTrue("Input file could not be deleted", inputFile.delete()); 
     assertTrue("Output file could not be deleted", outputFile.delete()); 
    } catch (IOException e) { 
     fail("No exception should be thrown"); 
    } 

} 

最后,我的其他测试人员说:‘你的程序左‘input.txt中’在以前的测试开放的’。任何想法,为什么呢?谢谢吨提前!

回答

0

的for循环您outputWords使用i循环计数器,而不是学家

for (int j = 0; i < outputWords.size(); j++) { 
        word = outputWords.get(i); 
        writer.printf("%3s" + "%1s\n", count, word); 
       } 

改变,要

for (int j = 0; i < outputWords.size(); j++) { 
        word = outputWords.get(j);//NEED TO USE J HERE 
        writer.printf("%3s" + "%1s\n", count, word); 
       } 

其他测试失败的原因是您显然应该在每次测试运行后删除输出文件。

+0

我不完全理解如何做到这一点,它只是inputFile.delete()?我试着将它添加到我的代码中,但它不起作用 –