Функция замены символа на несколько символов
От: oracle_developer  
Дата: 09.07.03 09:42
Оценка:
Как заменить один символ на несколько других в строке ( String)
Re: Функция замены символа на несколько символов
От: Blazkowicz Россия  
Дата: 09.07.03 10:01
Оценка:
Здравствуйте, oracle_developer, Вы писали:

_>Как заменить один символ на несколько других в строке ( String)


String replaceAll(String regex, String replacement)
Re[2]: Функция замены символа на несколько символов
От: SmaLL75 Россия http://smallweb.narod.ru
Дата: 11.07.03 07:10
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, oracle_developer, Вы писали:


_>>Как заменить один символ на несколько других в строке ( String)


B>String replaceAll(String regex, String replacement)


Я так понимаю, что это введено только с JDK 1.4

А например в 1.3 стандартные средства есть?
Что ни делается, всЁ к лучшему
Re[3]: Функция замены символа на несколько символов
От: Cider Россия  
Дата: 11.07.03 07:17
Оценка:
Здравствуйте, SmaLL75, Вы писали:

SLL>Я так понимаю, что это введено только с JDK 1.4


SLL>А например в 1.3 стандартные средства есть?


Только ручками... Бегать по строчке, ковырять ее.

Cider
Cider
Re[3]: Функция замены символа на несколько символов
От: TRV  
Дата: 11.07.03 12:57
Оценка:
Здравствуйте, SmaLL75, Вы писали:

SLL>А например в 1.3 стандартные средства есть?


Вот кусок кода, не знаю насколько оптимально, но должно работать:
public static String replaceAll(String source, String regex, String replacement) {
    String outstr = "";
    java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(source, regex);
    boolean hasMoreElements = tokenizer.hasMoreElements();
    while(hasMoreElements) {
        hasMoreElements = tokenizer.hasMoreElements();
        outstr += tokenizer.nextToken() + (hasMoreElements?replacement:"");
    }
    return outstr;
}
... << RSDN@Home 1.1 beta 1 >>
WBR, Руслан
Re[4]: Функция замены символа на несколько символов
От: Cider Россия  
Дата: 11.07.03 13:03
Оценка:
Здравствуйте, TRV, Вы писали:

TRV>Вот кусок кода, не знаю насколько оптимально, но должно работать:

TRV>
TRV>public static String replaceAll(String source, String regex, String replacement) {
TRV>    String outstr = "";
TRV>    java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(source, regex);
TRV>    boolean hasMoreElements = tokenizer.hasMoreElements();
TRV>    while(hasMoreElements) {
TRV>        hasMoreElements = tokenizer.hasMoreElements();
TRV>        outstr += tokenizer.nextToken() + (hasMoreElements?replacement:"");
TRV>    }
TRV>    return outstr;
TRV>}
TRV>


Не будет — StringTokenizer(source, delim); парсит source, разбивая его по всем символам из delim, а не по подстроке.

Cider
Cider
Re[4]: Функция замены символа на несколько символов
От: TRV  
Дата: 11.07.03 13:14
Оценка:
Здравствуйте, TRV, Вы писали:

TRV>Вот кусок кода, не знаю насколько оптимально, но должно работать:


Прошу прощения, код не проверял Вот исправил:

public static String replaceAll(String source, String regex, String replacement) {
    String outstr = "";
    java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(source, regex);
    boolean hasMoreElements = tokenizer.hasMoreElements();
    while(hasMoreElements) {
        String token = tokenizer.nextToken();
        hasMoreElements = tokenizer.hasMoreElements();
        outstr += token + (hasMoreElements?replacement:"");
    }
    return outstr;
}
... << RSDN@Home 1.1 beta 1 >>
WBR, Руслан
Re[5]: Функция замены символа на несколько символов
От: Cider Россия  
Дата: 11.07.03 13:16
Оценка:
Здравствуйте, TRV, Вы писали:

TRV>Прошу прощения, код не проверял Вот исправил:


TRV>
TRV>public static String replaceAll(String source, String regex, String replacement) {
TRV>    String outstr = "";
TRV>    java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(source, 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>


Да все равно работать не будет

Cider
Cider
Re[5]: Функция замены символа на несколько символов
От: TRV  
Дата: 11.07.03 13:21
Оценка:
Здравствуйте, Cider, Вы писали:

C>Не будет — StringTokenizer(source, delim); парсит source, разбивая его по всем символам из delim, а не по подстроке.


Посмотрите на тему
Вобщем, вот как надо было мне сразу написать:
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;
}
WBR, Руслан
Re[6]: Функция замены символа на несколько символов
От: Cider Россия  
Дата: 11.07.03 13:37
Оценка:
Здравствуйте, TRV, Вы писали:

TRV>Посмотрите на тему


Виноват, что-то мне приглючилось, что заменить надо подстроку на другую подстроку ... Тяпница, наверное
Cider
Cider
Re[6]: Функция замены символа на несколько символов
От: Сан Саныч Россия  
Дата: 14.07.03 06:13
Оценка: 1 (1)
Здравствуйте, 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
Re[7]: можно еще ускориться :)
От: nant Россия  
Дата: 14.07.03 13:56
Оценка:
Здравствуйте, Сан Саныч, Вы писали:

СС>Для ленивых приведу то что вывело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 .

Хотя по большому счету это не важно. В целом расценивать как шутку .
Re[8]: можно еще ускориться :)
От: Сан Саныч Россия  
Дата: 14.07.03 14:00
Оценка:
Здравствуйте, nant, Вы писали:

N>Здравствуйте, Сан Саныч, Вы писали:



Нет предела совершентству
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.