2017-05-15 3 views
1

기본적으로이 코드는 파일 (텍스트의 몇 단락)을 가져와 각 문자가 나타나는 시간을 계산하여 콘솔에 인쇄합니다. 계산 측면에서 모든 코드를 완료했지만 예외가 발생했습니다. 여기각 문자가 파일에 표시되는 시간 계산하기

java.util.NoSuchElementException 

at java.util.Scanner.throwFor(Scanner.java:862) 
at java.util.Scanner.next(Scanner.java:1371) 
at LetterCount.countOccurrences(LetterCount.java:29) 
at LetterCount.main(LetterCount.java:20) 

을 내 코드입니다 : 내가 이것을 실행하면 보여줍니다 나는 예외 : NoSuchElementException의 하이라이트 부분을 클릭하면

// Document your class here 

import java.util.Scanner; 
import java.io.File; 
import java.io.FileInputStream; 
public class LetterCount { 

public final static String FILENAME = "testFile.txt"; 

// Driver to test LetterInventory class 
public static void main(String[] args) { 
    Scanner inputFile = null; 
    try { 
     inputFile = new Scanner(new File(FILENAME)); 
    } catch (Exception e) { 
     System.out.println("File could not be opened: " + FILENAME); 
     System.exit(0); 
    } 

    int[] counts = countOccurrences(inputFile); 
    displayTable(counts); 
    resetTable(counts); 
} 

public static int[] countOccurrences (Scanner inputFile) { 
    int[]counts = new int[26]; 
    char[] characters = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 
    while (inputFile.hasNextLine()) { 
     String theWord = inputFile.next(); 
     theWord = theWord.toLowerCase(); 

     for (int j = 0; j < theWord.length(); j++) { 
      for (int counter = 0; counter < 26; counter++) { 
       if (theWord.charAt(j) == characters[counter]) { 
        counts[counter] += 1; 
       } 

      } 
     } 
    } 
    return counts; 
} 

public static void displayTable (int[] counts) { 
    for (int index = 0; index < 26; index++) { 
     System.out.println((char)('a' + index) + ":\t" + counts[index]); 
    } 
} 

public static void resetTable (int[] counts) { 
    System.out.println(); 
    for (int index = 0; index < 26; index++) { 
     System.out.println((char)('a' + index) + ":\t0"); 
    } 
} 
} 

, 나는 그것이 내가 만든 문자열을 언급 한 것을 보았다. 내가 뭘 잘못하고있어, 그것을 고치려면 어떻게해야합니까?

답변

2

데이터를 읽는 데 사용하는 방법은 더 많은 데이터가 있는지 확인하는 데 사용하는 것과 동일한 유형이어야합니다.

while 문에서 inputFile.hasNextLine()을 사용하기 때문에 그 뒤에 줄에 (지금처럼 inputFile.next() 대신)을 사용해야합니다.

또는 inputFile.hasNext()을 사용하도록 while 문을 변경할 수 있습니다.

0

inputFile.hasNextLine() 대신 while에서 inputFile.hasNext()을 사용해보세요. 다음 라인을 사용할 수 있다는 것은 다음 단어을 사용할 수있는 것과 반드시 ​​동일한 것은 아닙니다.

0

의 추가 작업을 수행하기 위해 디스플레이에 표시된 것과 동일한 수학을 사용할 수 있습니다. characters 어레이가 필요하지 않습니다. 또한 Scanner.hasNextLine()Scanner.next()으로 전화하는 방법과 일치해야합니다 (다음은 hasNext()으로 확인하십시오). 예 :

public static int[] countOccurrences(Scanner inputFile) { 
    int[] counts = new int[26]; 
    while (inputFile.hasNext()) { 
     String theWord = inputFile.next().toLowerCase(); 
     for (char ch : theWord.toCharArray()) { 
      if (Character.isLetter(ch)) { 
       counts[ch - 'a']++; 
      } 
     } 
    } 
    return counts; 
}