2015-12-09 86 views
0

我正在嘗試讀取文本文件並創建具有獨特單詞及其頻率的哈希映射。我搜索了一種刪除標點符號的方法,並嘗試實施它,但它似乎沒有工作。我試過在第四行代碼中使用以下代碼:line = line.replaceAll(「\ p {Punct} +」,「」);移除標點符號和大寫字母的問題

我錯過了什麼嗎?

try (BufferedReader br = new BufferedReader(new FileReader("Book 1 A_Tale_of_Two_Cities_T.txt"))) { 
     StringBuilder sb = new StringBuilder(); 
     String line = br.readLine(); 
     line = line.replaceAll("\\p{Punct}+", ""); 
     while (line != null) { 

      String[] words = line.split(" ");//those are your word 
      for (int i = 0; i < words.length; i++) { 
       if (m1.get(words[i]) == null) { 
        m1.put(words[i], 1); 
       } else { 
        int newValue = Integer.valueOf(String.valueOf(m1.get(words[i]))); 
        newValue++; 
        m1.put(words[i], newValue); 
       } 
      } 
      sb.append(System.lineSeparator()); 
      line = br.readLine(); 
     } 
    } 
    Map<String, String> sorted = new TreeMap<>(m1); 
    for (Object key : sorted.keySet()) { 
     System.out.println("Word: " + key + "\tCounts: " + m1.get(key)); 
    } 

我期待的輸出結果如下:

字:有計數:279

字:隨即計數:1

字:這些計數:156

問題是,我也得到這個作爲輸出:

Word:the se,計數:3

Word:這些。瀏覽次數:2

字:這些」罪狀:1

我想的話,從末端刪除(開始)標點並將它們添加到‘這些’等

計數

感謝您的幫助!

+1

添加一個代碼出錯的例子。添加預期的和實際的輸出。 – Perdomoff

+0

你的正則表達式看起來沒問題。你的意思是什麼「似乎沒有工作」?此外,您可以在一行代碼中執行此任務。 – Bohemian

+0

@真正的職位作爲答案 – Bohemian

回答

0

您運行的replaceAll看完第一行之後:

String line = br.readLine(); 
line = line.replaceAll("\\p{Punct}+", ""); 

所以第一行不會有任何標點符號。但是,然後,你進入這個while循環:

while (line != null) { 
    ... 
    line = br.readLine(); 
} 

所以在循環內沒有replaceAll。最後你讀另一行。然後你回到while。由於循環內沒有替換,因此第二行及其後面的行將保留標點符號。

該替換應該完成裏面的循環。而且,在閱讀第一行之後不應該這樣做,因爲理論上第一行可能是null(如果文件爲空)。

所以,你應該做的是做循環內完成驗證後,該行不爲空:

String line = br.readLine(); 

while (line != null) { 
    line = line.replaceAll("\\p{Punct}+", ""); 
    ... 
    line = br.readLine(); 
} 

現在,它測試,如果該行是空的,然後在它取代了標點符號。而且由於替換是在while內完成的,所以它也將應用於第二行以及後面的行。

+0

修復了我遇到的一些問題。所有的時間段,逗號等都被刪除,但我仍然得到破折號( - )和撇號的結果......是否有單獨的方法來刪除這些? –

+0

它爲我刪除破折號和撇號。但是你可以嘗試使用'[^ ​​\\ {Alpha}] +'而不是'\\ p {Punct} +',看看它是否適合你,@PeteOddo。注意該表達式中'''之前的空格。 – RealSkeptic

+0

這一個工作,謝謝! –

0

正如RealSkeptic指出的那樣,你需要把正則表達式替換成這個循環內部的

您的代碼還有其他幾個「問題」,但主要問題在於其中有很多。

這裏是你如何做到這一點的一個(雖然長)線:

Files.lines(Paths.get("Book 1 A_Tale_of_Two_Cities_T.txt") 
    .map(s -> s.replaceAll("\\p{Punct}", "").toLowerCase())) 
    .flatMap(s -> Arrays.stream(s.split("\\s+"))) 
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()) 
    .entrySet().stream() 
    .sorted(Map.Entry.comparingByKey()) 
    .forEach((k, v) -> System.out.println("Word: " + v + "\tCounts: " + v)); 

免責聲明:代碼可能無法編譯或工作,因爲它是用拇指在我的手機上(但有一個合理的機會,它會工作)

相關問題