有效的方法来替换字符串中的字符(Java)?
我正在写一个小型的Java程序,其中:有效的方法来替换字符串中的字符(Java)?
- 需要一个文本字符串
- 需要2个字符数组的
什么我尝试做听起来像是“查找和替换“但它不一样,所以我认为它很重要,以清除它。
无论如何,我想利用这个文本,发现如果从第一阵列中的任何字符的文字,如果是匹配炭,与来自第二char数组匹配炭(根据索引)替换它。
我将用一个例子解释: 可以说我的文字(字符串)是:,“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<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())
好吧,这是我正在尝试做的。 我刚测试过你的代码,它工作完美! 非常感谢。 **一个小问题:**此代码循环每个字符在文本中,并为每个字符循环第一个字符数组。为了文本中的第二个字符,我们将再次循环第一个字符,即时猜测没有其他方式? :S – Popokoko
如果文本中的第二个字符是数组中的第一个字符,该怎么办? – aeoliant
我不太明白你的意思吗?也许这是我的错,我只是读了我写给你的最后一篇文章,无论如何不清楚我的意思... 让我说我有一个4长度和两个数组的字符串,而他们两个是相同的大小可以说2长度。 我们首先迭代文本的四分之一字符,然后遍历整个数组(x2) ,然后我们迭代2/4字符......等等 我们一直检查相同的选项,所以我一直都没有肯定它有多高效.. – Popokoko
如何有效的,你需要它?你这样做了几百,几千,几百万字?
我不知道它是否是最有效的,但你可以在每个可能的标记上使用字符串indexOf()
方法,它会告诉你它是否在那里,然后你可以用来自另一个数组的相应字符。
Codewise,类似的信息(这是一半的伪代码的方式):
for(each of first array) {
int temp = YourString.indexOf(current array field);
if (temp >=0) {
replace with other array
}
}
我猜你正在寻找StringUtils.replaceEach,至少作为参考。
似乎是OP正在寻找什么。 – BenCole
OP要求高效。这需要可变长度的字符串数组,而不是字符数组,这使得它效率低下。 –
因为只有这样,才能知道,如果一个角色应该更换为其他后检查它,你(或任何UTIL方法)必须遍历整个文本,字符。您无法获得比O(n)(n是文本中的字符数)更好的复杂性。
对于像这样的小东西,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,使得它的速度甚至超过一个猜想。
我试过接受的解决方案和你的解决方案。我发现你的解决方案运行得更快(2次)。非常感谢你! –
让我们看看你到底做了什么 –
如果你想用'!'代替'a',怎么得到'j @ v @'? – jeha