2016-02-05 171 views
0

優化的算法,我有兩個字符串字符替換字符串中的

  1. 111TTT0000TT11T00

現在我想從柱2字符替換的T悉數亮相在串1。就像第一個T和0一樣,第二個T和0一起,第三個T和第一個T等等。

這樣做的一種方式是使用while循環,並比較每個字符,但在編程意義上,這不是一個好的方法來實現它。任何人都可以使用JAVA更好的算法來解決它嗎?

public void DataParse(String point, String code) 
{ 

    //////////tln("Point:"+point); 
    //////////tln("code:"+code); 
    // //////////tln(baseString_temp); 

    int counter=0; 

    while(baseString_temp.contains(point)) 
    {  
     if(code!=null) 
     { 
      String input=String.valueOf(code.charAt(counter)); 
      //zzzzz(input); 


      baseString_temp=baseString_temp.replaceFirst(point,input); 
      counter=counter+1; 
     } 
    } 

    ////////////System.out(baseString_temp); 
} 
+1

「但在編程意義上,這不是一個很好的實現方式」。爲什麼? – Tunaki

+0

另外,首先發布一些你的嘗試代碼,這樣我們可以從那裏引導你。 – James

+0

因爲它涉及遍歷整個字符串,閱讀每個字符,比較它然後替換。如果有人能更好地對它進行調整。 –

回答

5

每一次,當你使用containsreplaceFirst,你從begining強制程序枚舉字符串的字符。我相信這將是更好地做到這一點單程:

public static String replaceToken(String primary, String secondary, char token) { 

    char [] charArray =primary.toCharArray(); 

    int counter = 0; 
    for(int i=0; i<charArray.length; i++){ 
     if(charArray[i]==token){ 
      charArray[i] = secondary.charAt(counter); 
      counter++; 
      if(counter>=secondary.length()) break; 
     } 
    } 
    return new String(charArray); 
}  


public static void main(String[] args) {  
    String result = replaceToken("111TTT0000TT11T00", "001101", 'T'); 
} 

如果你真的想使用正則表達式這麼多,那麼你在這裏:

public static String replaceSequence(String primary, String secondary, String sequence){ 

    Pattern pattern = Pattern.compile(sequence + "+"); 
    Matcher matcher = pattern.matcher(primary); 

    int counter = 0; 
    char [] charArray = primary.toCharArray(); 

    while(matcher.find() && counter<secondary.length()){ 
     for(int i = matcher.start(); i<matcher.end(); i++){ 
      charArray[i] = secondary.charAt(counter++); 
      if(counter>=secondary.length()) break; 
     } 
    } 
    return new String(charArray); 
} 

但是,根據你的任務描述,我更喜歡第一種方法。

1

有幾件事。因爲字符串是不可改變的,

baseString_temp=baseString_temp.replaceFirst(point,input); 

總是會創建一個新的String對象(而且,它通過從一開始的字符串,尋找point)。如果你使用StringBuilder,你只分配一次內存,然後你可以改變它。實際上,使用類似Ken的答案的數組會更好,因爲它分配的方法調用較少,開銷較少。

此外,我想使用它自己的循環,並在最糟糕的情況下去到字符串的結尾。你只需要遍歷字符串一次,並在你繼續時進行替換。

工作例如:

public class Test { 

    private static String replace(char what, String input, String repls) { 
    StringBuilder sb = new StringBuilder(input); 
    int replIdx = 0; 
    for (int i = 0; i < input.length(); i++) { 
     if (input.charAt(i) == what) { 
     sb.setCharAt(i, repls.charAt(replIdx++)); 
     } 
    } 
    return sb.toString(); 
    } 

    public static void main(String[] args) { 
    System.out.println(replace('T', "111TTT0000TT11T00", "001101")); 
    } 
} 
+0

我忘了在回答中說'replaceFirst'每次都會創建一個新字符串。這將導致內存消耗。這很重要。 –