2015-02-09 110 views
1

提取詞和位置我有character分隔符(DELIMITERSSet,如.,等使用此我要拆分文本,並與他們的文本位置得到的話。 String.split()工作正常,如果你只想要單詞。與StringTokenizer相同。寫了一些簡單的方法來處理這個,但也許有更好的方法來實現這個結果?文本標記生成器 - 從文本

public List<String> extractWords(String text){ 
    List<String> words = new ArrayList<>(); 
    List<WordPos> positions = new ArrayList<>(); 
    int wordStart = -1; 
    for(int i=0; i < text.length(); i++){ 
     if(DELIMITERS.contains(text.charAt(i))){ 
      if(wordStart >=0){ //word just ended 
       String word = text.substring(wordStart, i); 
       positions.add(new WordPos(wordStart, i)); 
       words.add(word); 
      } 
      wordStart = -1; 
     }else{ //not delimiter == valid word 
      if(wordStart < 0){ //word just started 
       wordStart = i; 
      } 
     } 
    } 
    return words; 
} 

// inner static class for words positions 
public static class WordPos{ 
    int start; 
    int end; 
    public WordPos(int start, int end){ 
     this.start = start; 
     this.end = end; 
    } 
} 
+4

我認爲你應該在http://codereview.stackexchange.com/ – Matt 2015-02-09 10:14:51

回答

0

從效率的角度來看,我認爲你的解決方案並不差。 從審美方面(代碼看起來如何),我會用Apache Commons nStringUtils做這樣的事情(沒試過):使用

  1. 吐所有令牌: splitPreserveAllTokens()
  2. 疊代產生的陣列和存儲令牌以及每次從lastIndexOf調用中獲得的位置。
+4

上發佈這個,但是每次調用'lastIndexOf'都會減慢循環... – 2015-02-09 10:24:20

+0

@silvaran,你沒有讀過第一句我的答案?我並不是說明智的表現是最好的......但是,表現並沒有明確提及。我認爲從「乾淨的代碼」的角度來看,最好是既苗條又可讀。 – aviad 2015-02-09 12:55:50

0
List<String> words = new ArrayList<>(); 
List<WordPos> positions = new ArrayList<>(); 
int index = 0; 
String word = ""; 
StringTokenizer st = new StringTokenizer("., "); 


while(st.hasMoreTokens()) { 

word = st.nextToken(); 
words.add(word); 
positions.add(new WordPos(index,index+word.length())); 

index+= word.length() +1; 
} 

利用上述的方法,我假設有不連續2個分隔符。如果發生這種情況,方法是相同的。

+4

但是可能有兩個分隔符。 「約翰回家,天空很藍。」點和空間在一起。 – bartektartanus 2015-02-09 10:22:00

+0

@bartektartanus是否有一組固定的分隔符或可以更改? – 2015-02-09 10:34:10