powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / давайте тут пооптимизируем на тему транслита :)
10 сообщений из 10, страница 1 из 1
давайте тут пооптимизируем на тему транслита :)
    #32884069
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исходный топик - http://www.sql.ru/forum/actualthread.aspx?tid=154645

напомню, что обсуждались алгоритмы транслита и их скорость.
конечно, предложенный мной - самый тупой (в лоб), имеет два
цикла (причем один вложен в другой) и исполняется достаточно
долго.

далее следовал алгоритм с использованием Hashtable.

я предлагаю еще один :) написан и исполнен с одного раза, т.е. имеет место
оптимизация.

для начала определимся, что 'А' = 1040 (русская), 'Я' = 1071, вся
последовательность алфавита постоянная (за исключением 'Ё' = 1025).
для строчных букв: 'а' = 1072 ... 'я' = 1103, 'ё' = 1105.

код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
 package  test;

/**
 * author: афтар<br/>
 * package: test<br/>
 * date:    26.01.2005<br/>
 */
 public   class  TestTranslit {
   public   static   void  main(String[] args) {
    String test = "мама xyz сшила мне штаны qwer и срать хотела ty на меня значит я гад паршивый и ничего не кушал с утра";
     long  st = System.currentTimeMillis();
    String translit =  null ;
     for  ( int  i =  0 ; i <  100000 ; i++) {
      translit = toTranslit1(test);
    }
     long  ct = System.currentTimeMillis();
    System.out.println((ct - st) + ", " + translit);

    st = System.currentTimeMillis();
    translit =  null ;
     for  ( int  i =  0 ; i <  100000 ; i++) {
      translit = toTranslit2(test);
    }
    ct = System.currentTimeMillis();
    System.out.println((ct - st) + ", " + translit);
  }

   static  String[] f = {"А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ч", "Ц", "Ш", "Щ", "Э", "Ю", "Я", "Ы", "Ъ", "Ь", "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ч", "ц", "ш", "щ", "э", "ю", "я", "ы", "ъ", "ь"};
   static  String[] t = {"A", "B", "V", "G", "D", "E", "Jo", "Zh", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "H", "Ch", "C", "Sh", "Csh", "E", "Ju", "Ja", "Y", "`", "'", "a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "ch", "c", "sh", "csh", "e", "ju", "ja", "y", "`", "'"};

   private   static  String toTranslit1(String src) {
     if  (src ==  null ) {
       return  "";
    }
    StringBuffer res =  new  StringBuffer();

     for  ( int  i =  0 ; i < src.length(); ++i) {
      String add = src.substring(i, i +  1 );
       for  ( int  j =  0 ; j < f.length; j++) {
         if  (f[j].equals(add)) {
          add = t[j];
           break ;
        }
      }
      res.append(add);
    }

     return  res.toString();
  }

   static  String[] Echars = {"A", "B", "V", "G", "D", "E", "Zh", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "H", "C", "Ch", "Sh", "Csh", "`", "Y", "'", "E", "Ju", "Ja"};
  static String[] echars = {"a", "b", "v", "g", "d", "e", "zh", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "ch", "sh", "csh", "`", "y", "'", "e", "ju", "ja"};
   private   static  String toTranslit2(String src) {
     if  (src ==  null  || src.trim().length() ==  0 ) {
       return   new  String();
    }

    StringBuffer srcb =  new  StringBuffer(src);
    StringBuffer dstb =  new  StringBuffer(src.length());

     int  cs;
     for  ( int  i =  0 ; i < srcb.length(); i++) {
      cs = srcb.charAt(i);
       switch  (cs) {
         case   1025 :
          dstb.append("Jo");
           break ;
         case   1105 :
          dstb.append("jo");
           break ;
         default :
           if  (cs >=  1040  && cs <=  1071 ) {
            dstb.append(Echars[cs -  1040 ]);
          }  else   if  (cs >=  1072  && cs <=  1103 ) {
            dstb.append(echars[cs -  1072 ]);
          }  else  {
            dstb.append(( char )cs);
          }
      }
    }

     return  dstb.toString();
  }
}

toTransli1() - тот код, который приводил я ранее,
toTranslit2() - еще раз предлагаю :)

результаты:

7718, mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
1578, mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra

как видим, оба текста транслит делают, оставляя латинские буквы
латинскими. время выполнения - 7718 мс и 1578 мс

фпирёт! как говориться :)


PS да. предлагаю отталкиваться от чего-то общего при замерах времени
исполнения. пусть это будет toTranslit2(). число выполнений метода
пусть будет 100000.

--
Lacrima Mosa Est
...
Рейтинг: 0 / 0
давайте тут пооптимизируем на тему транслита :)
    #32884601
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему не тестировался вариант с hashtable? %)
...
Рейтинг: 0 / 0
давайте тут пооптимизируем на тему транслита :)
    #32884665
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
    private   static  String toTranslit3(String src) {
         if  (src ==  null  || src.trim().length() ==  0 ) {
             return  "";
        }

         char [] chars;
        src.getChars( 0 , src.length(), chars =  new   char [src.length()],  0 );

         char [] dest =  new   char [chars.length *  3 ];
         int  destPos =  0 ;

         int  c;
         for  ( int  i =  0 ; i < chars.length; i++) {
            c = chars[i];
             switch  (c) {
                 case   1025 :
                    dest[destPos++] = 'J';
                    dest[destPos++] = 'o';
                     break ;
                 case   1105 :
                    dest[destPos++] = 'j';
                    dest[destPos++] = 'o';
                     break ;
                 default :
                     if  (c >=  1040  && c <=  1071 ) {
                        String echar = Echars[c -  1040 ];
                         for  ( int  j =  0 ; j < echar.length(); j++) {
                            dest[destPos++] = echar.charAt(j);
                        }
                    }  else   if  (c >=  1072  && c <=  1103 ) {
                        String echar = echars[c -  1072 ];
                         for  ( int  j =  0 ; j < echar.length(); j++) {
                            dest[destPos++] = echar.charAt(j);
                        }
                    }  else  {
                        dest[destPos++] = ( char )c;
                    }
            }
        }

         return   new  String(dest,  0 , destPos);
    }


Код: plaintext
1.
2.
3.
 14342 , mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
1833, mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
 440 , mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
...
Рейтинг: 0 / 0
давайте тут пооптимизируем на тему транслита :)
    #32884683
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант с hashmap:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
(c) avtor topika
public static String toTranslit4(String src) {
           StringBuffer res = new StringBuffer();
           for (int i =  0 ; i < src.length(); ++i) {
               if (dic.get(src.subSequence(i, i +  1 )) != null) {
                   res.append(dic.get(src.subSequence(i, i +  1 )));
               } else {
                   res.append(src.subSequence(i, i +  1 ));
               }
           }
           return res.toString();
       }

5188, mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
...
Рейтинг: 0 / 0
давайте тут пооптимизируем на тему транслита :)
    #32884825
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsА почему не тестировался вариант с hashtable? %)
лень было ...put(); делать :)
...
Рейтинг: 0 / 0
давайте тут пооптимизируем на тему транслита :)
    #32884984
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я put в экселе делал, потом табы на "" меняешь и всё.
...
Рейтинг: 0 / 0
давайте тут пооптимизируем на тему транслита :)
    #32885068
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ NotGonnaGetUsА почему не тестировался вариант с hashtable? %)
лень было ...put(); делать :)

Cтранно.
У ты на чём запускал?
14000 и 7000 это большая разница для одного и того же теста :)
...
Рейтинг: 0 / 0
давайте тут пооптимизируем на тему транслита :)
    #32885177
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs А.Грасоff™ NotGonnaGetUsА почему не тестировался вариант с hashtable? %)
лень было ...put(); делать :)

Cтранно.
У ты на чём запускал?
14000 и 7000 это большая разница для одного и того же теста :)

P4 2GHz, 512 RAM, Win 2000 SP4
...
Рейтинг: 0 / 0
давайте тут пооптимизируем на тему транслита :)
    #32885408
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ NotGonnaGetUs А.Грасоff™ NotGonnaGetUsА почему не тестировался вариант с hashtable? %)
лень было ...put(); делать :)

Cтранно.
У ты на чём запускал?
14000 и 7000 это большая разница для одного и того же теста :)

P4 2GHz, 512 RAM, Win 2000 SP4

Лол.
P4 2.4, 768, win2k sp4, java 1.4.2_06/1.5.0_01.
Первый тест всегда около 14-15с.

Почему так получается?
...
Рейтинг: 0 / 0
давайте тут пооптимизируем на тему транслита :)
    #32886880
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще вариант. Быстрее процентов на 20.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
  // Cyrillic 0x400-0x4FF
  static String[] UnicodeCyrillic2Translit= new String[] {

  //      0     1     2     3     4     5     6     7     8     9    a   b   c   d   e   f

	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x40?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x41?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x42?
	"a",".","v","g","d","e",".","z","i","j","k","l","m","n","o","p", // 0x43?
	"r","s","t","u",".","h",".","ch","sh",".",".","y","'",".",".","ja",// 0x44?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x45?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x46?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x47?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x48?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x49?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4a?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4b?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4c?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4d?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4e?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".","."  // 0x4f?
  };

  private static String toTranslit5(String src) {

    if (src == null || src.trim().length() == 0) {
      return new String();
    }

    StringBuffer dstb = new StringBuffer(src.length());

    for(int i=0;i<src.length();i++)
    {
	short c_code=(short)src.charAt(i);
	if ((c_code>=0x0400)&&(c_code<0x04FF)) {dstb.append(UnicodeCyrillic2Translit[c_code-0x0400]);continue;}
	if (c_code<0x80) {dstb.append((char)c_code);continue;}
	dstb.append('?');		
    }

    return dstb.toString();
  }


Табличку всю мне было лень заполнять так что извиняйте.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / давайте тут пооптимизируем на тему транслита :)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]