2011-11-23 83 views
2

我正在寫一個小型的Java程序,其中:有效的方法來替換字符串中的字符(Java)?

  • 需要一個文本字符串
  • 需要2個字符數組的

什麼我嘗試做聽起來像是「查找和替換「但它不一樣,所以我認爲它很重要,以清除它。

無論如何,我想利用這個文本,發現如果從第一陣列中的任何字符的文字,如果是匹配炭,與來自第二char數組匹配炭(根據索引)替換它。

我將用一個例子解釋: 可以說我的文字(字符串)是:,「Java是真棒!」 我有2個數組(char []):「absm」和「!@ * $」。

希望的結果是將'a'更改爲'!' ,'b'到'@'等等。 意思是結果文本將是:

「java很棒!」改爲 - >「j @ v @ i * @ w * o $ e!」

什麼是這樣做的,爲什麼最有效的方法是什麼? 我想過循環的文本,但後來我發現它並不那麼高效。

StringBuilder的/String類可以使用)

+3

讓我們看看你到底做了什麼 –

+1

如果你想用'!'代替'a',怎麼得到'j @ v @'? – jeha

回答

3
StringBuilder sb = new StringBuilder(text); 
    for(int i = 0; i<text.length(); i ++) 
    { 
     for (int j = 0; j < firstCharArray.length;j++) 
     { 
      if (sb.charAt(i) == firstCharArray[j]) 
      { 
       sb.setCharAt(i, secondCharArray[j]); 
       break; 
      } 

     } 
    } 

這種方式是有效的,因爲它使用一個StringBuilder改變的地方字符(如果你使用的字符串你就必須創造新的每一次,因爲他們是不可改變的。)此外,它最大限度地減少傳球的量你必須要做的事情(1通過文本字符串,n通過第一個數組,其中n = text.length())

+0

好吧,這是我正在嘗試做的。 我剛測試過你的代碼,它工作完美! 非常感謝。 **一個小問題:**此代碼循環每個字符在文本中,併爲每個字符循環第一個字符數組。爲了文本中的第二個字符,我們將再次循環第一個字符,即時猜測沒有其他方式? :S – Popokoko

+0

如果文本中的第二個字符是數組中的第一個字符,該怎麼辦? – aeoliant

+0

我不太明白你的意思嗎?也許這是我的錯,我只是讀了我寫給你的最後一篇文章,無論如何不清楚我的意思... 讓我說我有一個4長度和兩個數組的字符串,而他們兩個是相同的大小可以說2長度。 我們首先迭代文本的四分之一字符,然後遍歷整個數組(x2) ,然後我們迭代2/4字符......等等 我們一直檢查相同的選項,所以我一直都沒有肯定它有多高效.. – Popokoko

1

如何有效的,你需要它?你這樣做了幾百,幾千,幾百萬字?

我不知道它是否是最有效的,但你可以在每個可能的標記上使用字符串indexOf()方法,它會告訴你它是否在那裏,然後你可以用來自另一個數組的相應字符。

Codewise,類似的信息(這是一半的僞代碼的方式):

for(each of first array) { 
    int temp = YourString.indexOf(current array field); 
    if (temp >=0) { 
     replace with other array 
    } 
} 
3

我猜你正在尋找StringUtils.replaceEach,至少作爲參考。

+0

似乎是OP正在尋找什麼。 – BenCole

+0

OP要求高效。這需要可變長度的字符串數組,而不是字符數組,這使得它效率低下。 –

0

因爲只有這樣,才能知道,如果一個角色應該更換爲其他後檢查它,你(或任何UTIL方法)必須遍歷整個文本,字符。您無法獲得比O(n)(n是文本中的字符數)更好的複雜性。

1

把2個數組你有一個地圖

Map<Character, Character> //or Map of Strings 

其中關鍵是「A」,「B」等等,值是您要使用替代字符 - 「@」 etc ...

然後,只需將您的字符串中的鍵替換爲值。

+0

謝謝,但這個例子太高級了,因爲我不應該使用這個對象。 – Popokoko

+0

沒問題。只是稍後想一想。 – Mechkov

1

對於像這樣的小東西,indexOf()搜索可能比地圖快,同時「避免」接受答案的內部循環。當然,循環仍然存在,在String.indexOf()內部,但它可能會被JIT編譯器優化爲一個票價 - 因爲它被大量使用。

static String replaceChars(String source, String from, String to) 
{ 
    StringBuilder dest = new StringBuilder(source); 
    for (int i = 0; i < source.length(); i++) 
    { 
     int foundAt = from.indexOf(source.charAt(i)); 
     if (foundAt >= 0) 
      dest.setCharAt(i,to.charAt(foundAt)); 
    } 
    return dest.toString(); 
} 

更新:甲骨文/ Sun JIT至少在某些處理器的的indexOf()使用SIMD,使得它的速度甚至超過一個猜想。

+0

我試過接受的解決方案和你的解決方案。我發現你的解決方案運行得更快(2次)。非常感謝你! –