有效的方法来替换字符串中的字符(java)?

我正在写一个小的JAVA程序:

  • 将文本作为字符串
  • 需要2个字符arrays

我试图做的将听起来像“找到并替换”,但它不一样,所以我认为清除它很重要。

无论如何,我想要获取此文本,查找第一个数组中的任何char是否与文本中的char匹配,如果是,请将其替换为第二个char数组中匹配的char(根据索引)。

我将用一个例子来解释:让我说我的文本(String)是:“java很棒!”; 我有2个数组(char []):“absm”和“!@ * $”。

希望的结果是将’a’改为’!’ ,’b’到’@’等等……意味着生成的文本将是:

“java真棒!” 改为 – >“j @ v @ i * @ w * o $ e!”

这样做最有效的方法是什么?为什么? 我想过循环文本,但后来发现它不那么有效。

(可以使用StringBuilder / String类)

 StringBuilder sb = new StringBuilder(text); for(int i = 0; i 

这种方式很有效,因为它使用StringBuilder来更改字符(如果你使用字符串,你每次都必须创建新的字符,因为它们是不可变的。)此外,它最大限度地减少了你必须做的传递量(1通过文本字符串和n遍历第一个数组,其中n = text.length())

我猜你正在寻找StringUtils.replaceEach ,至少作为参考。

你需要多高效率? 你这样做数百,数千,数百万字吗?

我不知道它是否是最有效的,但你可以在每个可能的令牌上使用字符串indexOf()方法,它会告诉你它是否存在,然后你可以用相应的同时替换该索引来自其他数组的char。

Codewise,类似的东西(顺便说一下,这是半伪代码):

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

将您拥有的2个数组放在Map中

 Map //or Map of Strings 

其中键是“a”,“b”等…而值是你要替换的字符 – “@”等….

然后只需用值替换String中的键。

对于像这样的小东西,indexOf()搜索可能比地图更快,而“避免”接受答案的内部循环。 当然,循环仍在那里,在String.indexOf()中,但它很可能被JIT编译器优化为fare-the-well,因为它被大量使用。

 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(); } 

更新:Oracle / Sun JIT在indexOf()的至少一些处理器上使用SIMD ,使其比人们想象的更快。

因为知道是否应该替换字符的唯一方法是检查它,你(或任何util方法)必须循环遍历整个文本,字符接着另一个。 你永远无法实现比O(n)更好的复杂性(n是文本中的字符数)。