2012-06-18 38 views
0

我有一個方法getNextChar(),它逐字符地讀取一個字符串。我正在寫一個方法來獲取由getNextChar()提供的字符序列中的單詞。如何從java中的字符序列中獲取單詞?

該文本包含標點符號和其他特殊字符。

我想擁有一個包含所有標點符號和特殊字符的數組,當我讀取文本的字符時,檢查字符是否在數組中以忽略它。 該方法將識別該單詞,當它獲得一個空間。 單詞將存儲在收集(例如:地圖),因爲我需要計數頻率以及通過檢查單詞是否已被插入之前在地圖和增加該單詞的計數器。

  1. 這是最好的和高效這樣做的方式?我正在尋找最有效的方式。 A
  2. 是否有任何標點符號和特殊字符的完整列表
+0

你只有讓你的數據的字符在時間?或者你是否一次獲得一個字符串,而你只是選擇字符迭代,因爲那是你認爲找到分詞符的最好方法? –

+0

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html這可能可以做你想要的東西 – theBigChalk

+0

我得到一個字符一次,直到我得到EOFException當沒有更多的字符。 – Sami

回答

0

你可以使用string.split()掰開串入由空格分隔字符串數組(你的話。)您也可以檢查與Character.isLetterOrDigit每個字符(),以避免標點符號。 (不一定按此順序)。

+0

儘管這不是最「高效」的方式。它需要讀取整個字符串,然後*解析這些單詞。 OP想要一種方法來實現這一點。 –

+0

啊!抱歉。我讀了「最好」,我的思想跳過了「高效」。通常這兩個不一樣。 – BlackVegetable

+0

雖然... :) –

0

如果使用一組字符,標點的查找將會有更好的性能。

Set<Character> punctationchars .... 
if(punctationcahars.contains(yourChar) { ... } 
+0

如果字符數很少,數組的「O(n)」查找與散列表的「O(1)」查找之間的區別基本相同。這取決於我猜想有多少個角色。 –

0

只需用一個ScannerString s到閱讀:

Scanner in = new Scanner(...); 

while (in.hasNext()) { 
    String word = in.next(); 
    /* do something with the word, check punctuation, etc. */ 
} 
+0

但這需要解析所有字符並從中生成一個字符串..聽起來不太有效。 – Sami

1

我覺得還有一個更簡單的方法來做到這一點。

無論您的輸入源是什麼,我都會使用Scanner類讀取它。您可以使用輸入字符串實例化此類,並調用Scanner.nextWord()方法獲取字符串中的下一個單詞。這會自動檢查空白並返回下一個單詞。然後,你可以使用與string.replace(「標點」,「」),除去標點,然後再插入這段話成爲一個ArrayList,你可以指望的頻率等

Scanner reader = new Scanner(string); 
String word = reader.nextWord(); 
word=word.replaceAll(//code); 
list.add(word); 
+0

您還可以使用'usePattern()'來更改掃描儀的分隔符模式,以匹配任何空白或分隔標點符號的序列(注意不要包含連字符) –

+0

好主意,這將有助於特異性 –

相關問題