2012-04-06 120 views
0

在我看來,這似乎很直截了當......直到我坐下來開始打字。Java文本標籤替換代碼

無論如何,我的任務是編寫一個方法,該方法將在字符串中找到「標籤」,並將它們適當地替換,輸出結果字符串。該函數的聲明看起來是這樣的:

public String doStuff(String source, Map<Integer, String> replacementData) 

的想法是,每一個「標籤」將在「< < >>」(這樣的正則表達式是像」包圍的整數值< < [0。 -9] + >>。「)。在source中遇到其中一個標籤時,應從標籤中收集標籤中包含的整數I,並且標籤應通過replacementData.get(I)

替換。無論如何,我想要高效地完成此操作。我只是不確定如何去做。我看了一下Pattern和Matcher,我不認爲這是正確的路線。我不想使用String.indexOf和類似的東西,因爲它效率低下(不是嗎?)。

感謝您的建議!

+0

什麼錯誤使用模式/匹配器?這很快。 – 2012-04-06 23:52:31

+0

這具有作品中不成熟優化的所有症狀,你知道......製作一個首先工作的程序,剖析它,並在必要時進行優化。我敢打賭,這是沒有必要的,因爲很難將標籤替代品變成低效率。 – dasblinkenlight 2012-04-06 23:59:56

回答

2

使用正則表達式模式和匹配器的方式是捕獲整數稱爲一個組,然後用它來替換。 你的問題的另一個有趣的部分是一步一步的更換。那你需要做的一系列步驟中的Javadoc描述爲appendReplacement method

示例代碼:

String str = "abc<<1>>def<<2>>ghi"; 
java.util.Map<Integer,String> replacementMap = new java.util.HashMap<Integer,String>() { 
    { 
     put(1," ONE "); 
     put(2," TWO "); 
    } 
}; 
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("<<([0-9]+)>>"); 
java.util.regex.Matcher matcher = pattern.matcher(str); 
int start = 0; 
StringBuffer sb = new StringBuffer(); 
while(matcher.find()) { 
    matcher.appendReplacement(sb,replacementMap.get(Integer.parseInt(matcher.group(1)))); 
} 
matcher.appendTail(sb); 
System.out.println(sb.toString()); 

輸出:abc ONE def TWO ghi

+0

給它一個測試運行(抱歉花了這麼長時間)。看起來好像很棒!謝謝 :) – 2012-04-10 17:14:09

0

幼稚的做法:

public String doStuff(String source, Map<Integer, String> replacementData){ 

    for(Map.Entry<Integer,String> entry : replacementData.entrySet()) 
     source = source.replace("<<"+entry.getKey().toString()+">>", entry.getValue()); 

    return source; 
} 

它不會顯得太低效了我。讓它更有效率的唯一方法是嘗試在一個字符串中完成所有事情,但這實際上涉及重寫String.replace()

考慮到將要進入的工作量,只有在剖析器顯示這是一個真正的瓶頸時,我纔會將這種優化放在類別中。

Puneet的基於Matcher的方法比較好,因爲它只傳遞一次字符串。