2014-10-15 2 views
0
public static void frequencyFinder() throws FileNotFoundException, IOException { 
    String foldername = ".../Meta_Oct/separate"; 
    File folder = new File(foldername); 
    File[] listOfFiles = folder.listFiles(); 


    String line; 
    for (int x = 0; x < listOfFiles.length; x++) { 
     BufferedReader in = new BufferedReader(new FileReader(listOfFiles[x])); 
     String filename = listOfFiles[x].getName(); 
     String language = filename.split("@")[0]; 
     String target = filename.split("@")[1]; 
     String source = filename.split("@")[2]; 
     int frequency = 0; 

     while ((line = in.readLine()) != null) { 
      lemma_match = line.split(";")[3]; 
      frequency = 1; 
      while((in.readLine().split(";")[3]).equals(lemma_match)){     
       frequency++; 
       line = in.readLine();      
      } 

      System.out.println(target + ":" + source +":"+lemma_match + ":" + frequency); 
      frequency = 0;     
      lemma_match = null; 
     } 


    } 
} 

마지막 열의 단어 빈도를 계산해야합니다. 문제는 while 루프가 일부 줄을 건너 뛰고 NullPointerException으로 끝나고 모든 주파수가 그 지점까지 계산되지 않는다는 것입니다. 샘플 파일뿐만 아니라 아래의 스택 추적을 첨부했습니다.정렬 된 목록의 단어 빈도 계산

EN;GOVERNMENT;DISEASE;bristle at 
EN;GOVERNMENT;DISEASE;contract 
EN;GOVERNMENT;DISEASE;detect in 
EN;GOVERNMENT;DISEASE;detect in 
EN;GOVERNMENT;DISEASE;immunize against 
EN;GOVERNMENT;DISEASE;inherit from 
EN;GOVERNMENT;DISEASE;spread 
EN;GOVERNMENT;DISEASE;spread 
EN;GOVERNMENT;DISEASE;spread 
EN;GOVERNMENT;DISEASE;stave off 
EN;GOVERNMENT;DISEASE;stave off 
EN;GOVERNMENT;DISEASE;transmit 
EN;GOVERNMENT;DISEASE;treat 
EN;GOVERNMENT;DISEASE;treat 
EN;GOVERNMENT;DISEASE;treat as 
EN;GOVERNMENT;DISEASE;treat by 
EN;GOVERNMENT;DISEASE;ward off 

스택 추적 :이 코드 내 3 곳에서 새로운 라인을 읽기 때문에

while ((line = in.readLine()) != null) { // here you read a line 
     lemma_match = line.split(";")[3]; 
     frequency = 1; 
     while((in.readLine().split(";")[3]).equals(lemma_match)){ // here you read 
                    // another line 
      frequency++; 
      line = in.readLine(); // here you read another line     
     } 

것은, 당신이 주파수를 증가하지 않습니다

GOVERNMENT:DISEASE:bristle at :1 
GOVERNMENT:DISEASE:detect in :2 
GOVERNMENT:DISEASE:spread :2 
GOVERNMENT:DISEASE:stave off :1 
Exception in thread "main" java.lang.NullPointerException 
GOVERNMENT:DISEASE:treat :2 
    at javaapplication6.FrequencyFinder.frequencyFinder(FrequencyFinder.java:53) 
    at javaapplication6.FrequencyFinder.main(FrequencyFinder.java:26) 
Java Result: 1 

답변

1

다음 코드는 문제가있다 이러한 모든 읽기. 예를 들어, 내부 루프의 각 반복에서 두 행을 읽고 있지만 frequency 만 한 번만 읽습니다. 내부 루프를 고치더라도 내부 while 루프가 끝나고 외부 while 루프가 새 라인을 읽으면 몇 줄을 놓칠 수 있습니다.

또한 내부 while 루프는 split으로 시도하기 전에 in.readLine() != null을 확인하지 않으므로 NullPointerException을 제공합니다.

String lemma_match = ""; 
    while ((line = in.readLine()) != null) { 
     String new_lemma_match = line.split(";")[3]; 
     if (!lemma_match.equals(new_lemma_match)) { // start count for a new lemma 
      if (!lemma_match.equals("")) { 
       System.out.println(target + ":" + source +":"+lemma_match + ":" + frequency); 
      } 
      lemma_match=new_lemma_match; 
      frequency = 1; // initialize frequency for new lemma 
     } else { 
      frequency++; // increase frequency for current lemma 
     } 
    } 
+0

감사합니다. 그것은 완벽하게 작동합니다! – user3525357

0

는 해시 맵의 항목을 계속 추가 :

이제 우리는 하나의 루프와 함께이 작업을 수행 할 수있는 방법을 볼 수 있습니다. 각 고유 항목 (키)에 대해 값을 증가시킵니다. 마침내 당신은 당신의 결과를 얻을 것이다.