2011-11-23 85 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次)。非常感谢你! –