powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / translit
17 сообщений из 17, страница 1 из 1
translit
    #32882238
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу я текст в файле автоматом переводить из кирилицы в транслит. Пока рабочий план - сделать хаш в котором каждому знаку кирилицы соответствует латиница и прочесать весь текст заменяя кир на лат. Какие альтернативы есть и как это делать если не изобретать велосипед
...
Рейтинг: 0 / 0
translit
    #32882248
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naugхочу я текст в файле автоматом переводить из кирилицы в транслит. Пока рабочий план - сделать хаш в котором каждому знаку кирилицы соответствует латиница и прочесать весь текст заменяя кир на лат. Какие альтернативы есть и как это делать если не изобретать велосипед
два массива вместо хэша
...
Рейтинг: 0 / 0
translit
    #32882386
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А смысл? Быстрее? Памяти меньше жрёт? Есть какая-то фенька связанная с тем что знаки обозначаются интом?
...
Рейтинг: 0 / 0
translit
    #32882393
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а причем тут знаки и int? например, Ж == Zh (не инт). я говорил о массивах
строк

--
Lacrima Mosa Est
...
Рейтинг: 0 / 0
translit
    #32882436
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
массив == array?
то есть String [33] rus; и String [33] eng; ?

А как связь между ними устанавливать?
...
Рейтинг: 0 / 0
translit
    #32882475
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naugмассив == array?
то есть String [33] rus; и String [33] eng; ?

А как связь между ними устанавливать?

Может по индексу эррэя :)
...
Рейтинг: 0 / 0
translit
    #32882499
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как я внутри программы вычислю что Б имеет индекс2? Через свич 0.о ? Зачем? - в нэше это гораздо проще. Тут другой вопрос назрел - конкретно замена букв - есть ли метод которому можно сказать: замени все такие-то знаки в стринге на такие-то (тут как раз масивы бы и пригодились)
...
Рейтинг: 0 / 0
translit
    #32882507
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naugа как я внутри программы вычислю что Б имеет индекс2? Через свич 0.о ? Зачем? - в нэше это гораздо проще. Тут другой вопрос назрел - конкретно замена букв - есть ли метод которому можно сказать: замени все такие-то знаки в стринге на такие-то (тут как раз масивы бы и пригодились)
блянах. во-первых тут уже был нижеприведенный код, во-вторых, че тут с чем
связывать? транслит прост - че там наворачивать?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
   private  String toTranslit(String src) {
     if  (src ==  null ) {
       return  "";
    }
    String[] f = {"А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ч", "Ц", "Ш", "Щ", "Э", "Ю", "Я", "Ы", "Ъ", "Ь", "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ч", "ц", "ш", "щ", "э", "ю", "я", "ы", "ъ", "ь"};
    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", "`", "'"};

    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();
  }
...
Рейтинг: 0 / 0
translit
    #32882525
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naugа как я внутри программы вычислю что Б имеет индекс2? Через свич 0.о ? Зачем? - в нэше это гораздо проще. Тут другой вопрос назрел - конкретно замена букв - есть ли метод которому можно сказать: замени все такие-то знаки в стринге на такие-то (тут как раз масивы бы и пригодились)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
replaceAll

 public  String replaceAll(String regex,
                         String replacement)

    Replaces each substring of  this  string that matches the given regular expression with the given replacement.

    An invocation of  this  method of the form str.replaceAll(regex, repl) yields exactly the same result as the expression

        Pattern.compile(regex).matcher(str).replaceAll(repl)

    Parameters:
        regex - the regular expression to which  this  string is to be matched 
    Returns:
        The resulting String 
     Throws :
        PatternSyntaxException -  if  the regular expression's syntax is invalid
    Since:
         1 . 4 
    See Also:
        Pattern

...
Рейтинг: 0 / 0
translit
    #32882567
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грасов - а с хашем получается так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Hashtable dict= new  Hashtable();
...
много-много put
...
StringBuffer res =  new  StringBuffer();

 for  ( int  i =  0 ; i < src.length(); ++i) {
      res.append(dicе.get(src.subSequence(i,i+ 1 ) ) );
}
Так в чём выгода массивов - put-ы мног ресурсов жрут или что? Нафиг такое кол-во ифов и лупов?

P.S. есть разница - использовать substring или subSequence?
...
Рейтинг: 0 / 0
translit
    #32882652
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaugГрасов - а с хашем получается так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Hashtable dict= new  Hashtable();
...
много-много put
...
StringBuffer res =  new  StringBuffer();

 for  ( int  i =  0 ; i < src.length(); ++i) {
      res.append(dicе.get(src.subSequence(i,i+ 1 ) ) );
}
Так в чём выгода массивов - put-ы мног ресурсов жрут или что? Нафиг такое кол-во ифов и лупов?

P.S. есть разница - использовать substring или subSequence?

возьми потесть :) потом скажешь :)
...
Рейтинг: 0 / 0
translit
    #32882680
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еслиб я ещё умел тестить...

Кстати - нашел такой баг (или фичу) - при попаданий в срочку не-киррилицы(знаков отсутствующих в первом массиве/ключах хэша) хаш выдаст null а массив просто пропустит.
...
Рейтинг: 0 / 0
translit
    #32882687
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naugеслиб я ещё умел тестить...

выполняешь код 10000 раз на большом пердложении из русского
текста и замеряешь время в обоих случаях.
...
Рейтинг: 0 / 0
translit
    #32882821
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.
     private  String toTranslit(String src) {
         if  (src ==  null ) {
             return  "";
        }
        String[] f = {"А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ч", "Ц", "Ш", "Щ", "Э", "Ю", "Я", "Ы", "Ъ", "Ь", "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ч", "ц", "ш", "щ", "э", "ю", "я", "ы", "ъ", "ь"};
        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", "`", "'"};

        StringBuffer res =  new  StringBuffer();

         for  ( int  i =  0 ; i < src.length(); ++i) {
             char  add = src.charAt(i);
             for  ( int  j =  0 ; j < f.length; j++) {
                 if  (f[j].length() ==  1  && f[j].charAt( 0 ) == add) {
                    res.append(t[j]);
                     break ;
                }  else  {
                     if  (j == f.length -  1 ) {
                        res.append(add); //unknown input char found - insert as is.
                    }
                }
            }
        }

         return  res.toString();
    }

...
Рейтинг: 0 / 0
translit
    #32883117
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при тесте на моём файле (много коротких строчек) и числе повторов 1000 массивы заняли в среднем 48 единиц, хэш- 22 единицы(после модификации хэша чтобы он как массивы оставлял незнакомые знаки -24).
Ниже - тестированный код(с учётом того что к методам обращались много раз я вынес оттуда создание массивов и хэша поэтому поправте если я что сделал не так):

Код: 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.
 public   class  test2 {
     public   static  String[] f = {"А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ч", "Ц", "Ш", "Щ", "Э", "Ю", "Я", "Ы", "Ъ", "Ь", "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ч", "ц", "ш", "щ", "э", "ю", "я", "ы", "ъ", "ь"};
     public   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", "`", "'"};
     public   static   void  main(String[] args) {
           try  {
             long  i;
            i = System.currentTimeMillis();
             for  ( int  n =  0 ; n <  1000 ; n++) {
                BufferedReader fin =  new  BufferedReader( new  FileReader("file"));
                String line;
                String translit;
                 while  ((line = fin.readLine()) !=  null ) {
                    translit = toTranslit(line);
                }
            }
            System.out.println((i - System.currentTimeMillis()) /  1000 );
        }  catch  (FileNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }  catch  (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
     private   static  String toTranslit(String src) {
         if  (src ==  null ) {
             return  "";
        }
        StringBuffer res =  new  StringBuffer();
         for  ( int  i =  0 ; i < src.length(); ++i) {
             char  add = src.charAt(i);
             for  ( int  j =  0 ; j < f.length; j++) {
                 if  (f[j].length() ==  1  && f[j].charAt( 0 ) == add) {
                    res.append(t[j]);
                     break ;
                }  else  {
                     if  (j == f.length -  1 ) {
                        res.append(add); //unknown input char found - insert as is.
                    }
                }
            }
        }
         return  res.toString();
    }
}



Код: 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.
ublic  class  test {
     static  Hashtable dic =  new  Hashtable();
     public   static   void  dict() {
 dic.put("Й", "J");
      ...
куча put
...
  dic.put("ё", "jo");
    }
     public   static   void  main(String[] args) {
        dict();
         try  {
             long  i;
            i = System.currentTimeMillis();
             for  ( int  n =  0 ; n <  1000 ; n++) {
                BufferedReader fin =  new  BufferedReader( new  FileReader("NB-balance1.csv"));
                String line;
                String translit;
                 while  ((line = fin.readLine()) !=  null ) {
                    translit = cyr2lat(line);
                }
            }
            System.out.println((i - System.currentTimeMillis()) /  1000 );
        }  catch  (FileNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }  catch  (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
     public   static  String cyr2lat(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();
    }
}
...
Рейтинг: 0 / 0
translit
    #32883176
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я заметил что в примере с хашем я вызываю метод который заполняет хэш до того как засекаю время но после переноса ничего не изменилось - то есть put-ы не тормозят
Код: plaintext
1.
2.
3.
4.
  try  {
             long  i;
            i = System.currentTimeMillis();
dict()
...
Рейтинг: 0 / 0
translit
    #32884578
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумный результат.
Вариант с массивами не оптимален с самого начала, т.к. используется линейный поиск элемента.
Если воспользоваться binary search, то думаю будет сильный вин %)

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


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