Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, oracle_developer, Вы писали:
_>>Как заменить один символ на несколько других в строке ( String)
B>String replaceAll(String regex, String replacement)
Я так понимаю, что это введено только с JDK 1.4
А например в 1.3 стандартные средства есть?
Что ни делается, всЁ к лучшему
Re[3]: Функция замены символа на несколько символов
Здравствуйте, TRV, Вы писали:
TRV>Здравствуйте, Cider, Вы писали:
C>>Не будет — StringTokenizer(source, delim); парсит source, разбивая его по всем символам из delim, а не по подстроке.
TRV>Посмотрите на тему TRV>Вобщем, вот как надо было мне сразу написать: TRV>
TRV>public static String replaceAll(String source, char regex, String replacement) {
TRV> String outstr = "";
TRV> java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(source, String.valueOf(regex));
TRV> boolean hasMoreElements = tokenizer.hasMoreElements();
TRV> while(hasMoreElements) {
TRV> String token = tokenizer.nextToken();
TRV> hasMoreElements = tokenizer.hasMoreElements();
TRV> outstr += token + (hasMoreElements?replacement:"");
TRV> }
TRV> return outstr;
TRV>}
TRV>[/jav
Вобщем этой плохой пример. Писать надо так:
[java]
import java.io.StringReader;
import java.io.StringWriter;
import java.io.IOException;
public class Main {
public static String replaceAll(String source, char regex, String replacement) {
String outstr = "";
java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(source, String.valueOf(regex));
boolean hasMoreElements = tokenizer.hasMoreElements();
while (hasMoreElements) {
String token = tokenizer.nextToken();
hasMoreElements = tokenizer.hasMoreElements();
outstr += token + (hasMoreElements ? replacement : "");
}
return outstr;
}
public static String _replaceAll(String source, char regex, String replacement) {
StringReader reader = new StringReader(source);
StringWriter writer = new StringWriter();
try {
while(true) {
int _char = reader.read();
if(_char == -1) {
break;
} else if(_char == regex) {
writer.write(replacement);
} else {
writer.write(_char);
}
}
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use Options | File Templates.
}
return writer.toString();
}
public static void main(String[] args) {
String string = "";
for (int i = 0; i < 1000; i++) {
string += "Мама. Мама. Чтоя буду делать? Ку!\n";
}
long time = System.currentTimeMillis();
string = replaceAll(string, '!', "$$");
time = System.currentTimeMillis() - time;
System.out.println(time);
string = "";
for (int i = 0; i < 1000; i++) {
string += "Мама. Мама. Чтоя буду делать? Ку!\n";
}
time = System.currentTimeMillis();
string = _replaceAll(string, '!', "$$");
time = System.currentTimeMillis() - time;
System.out.println(time);
}
}
Для ленивых приведу то что вывелоcь в консоль:
2093
30
Здравствуйте, Сан Саныч, Вы писали:
СС>Для ленивых приведу то что вывелоcь в консоль: СС>2093 СС>30
Дык можно еще быстрее:
import java.io.*;
public class Main {
public static String replaceAll(String source, char regex, String replacement) {
// ...
// the same code
}
public static String __replaceAll(String source, char regex, String replacement) {
int len = source.length();
StringBuffer buf = new StringBuffer(len);
for (int i=0;i<len;i++)
{
char _char = source.charAt(i);
if(_char == regex) {
buf.append(replacement);
}
else {
buf.append(_char);
}
}
return buf.toString();
}
public static String _replaceAll(String source, char regex, String replacement) {
// ...
// the same code
}
public static void main(String[] args) {
int N = 1000;
int iterations=100;
long times[] = new long[iterations];
StringBuffer buff=new StringBuffer();
for (int i = 0; i < N ; i++) {
buff.append("Мама. Мама. Что я буду делать? Ку!\n");
}
String string = buff.toString();
System.out.println("start");
for (int j = 0; j< iterations; j++)
{
long time = System.currentTimeMillis();
String result = __replaceAll(string, '!', "$$");
times[j] = System.currentTimeMillis() - time;
}
printRes("__replaceAll",times);
for (int j = 0; j< iterations; j++)
{
long time = System.currentTimeMillis();
String result = _replaceAll(string, '!', "$$");
times[j] = System.currentTimeMillis() - time;
}
printRes("_replaceAll",times);
for (int j = 0; j< iterations; j++)
{
long time = System.currentTimeMillis();
String result = replaceAll(string, '!', "$$");
times[j] = System.currentTimeMillis() - time;
}
printRes("replaceAll",times);
}
private static void printRes(String name, long[] times)
{
long sum=0;
long sumSq=0;
int N = times.length;
for (int i = 0;i<N;i++)
{
sum+=times[i];
sumSq+=(times[i]*times[i]);
}
double avg = (double)sum/N;
double dev = Math.sqrt((double)(sumSq)/N-avg*avg)/sum;
double err = dev*Math.sqrt((double)N/(N-1));
System.out.println(name+":\naverage time:"+avg+"ms\nStdDev:"+dev+"\nStdError:"+err);
}
}
И вывод:
average time:3.0ms
StdDev:0.016666666666666666
StdError:0.016750630254320203
_replaceAll:
average time:3.71ms
StdDev:0.013596746433436575
StdError:0.013665244330094578
replaceAll:
average time:909.7ms
StdDev:0.0015894152739755665
StdError:0.0015974224544960253
Оно и понятно — экономится время на try/catch блоке, да и StringReader со StringWriter — обертки поверх String и StringBuffer.
Ну и еще в 1.5 обещали java.io сделать deprecated .
Хотя по большому счету это не важно. В целом расценивать как шутку .