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

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

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

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

Может по индексу эррэя :)
...
Рейтинг: 0 / 0
25.01.2005, 14:38
    #32882499
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
а как я внутри программы вычислю что Б имеет индекс2? Через свич 0.о ? Зачем? - в нэше это гораздо проще. Тут другой вопрос назрел - конкретно замена букв - есть ли метод которому можно сказать: замени все такие-то знаки в стринге на такие-то (тут как раз масивы бы и пригодились)
...
Рейтинг: 0 / 0
25.01.2005, 14:41
    #32882507
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
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
25.01.2005, 14:45
    #32882525
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
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
25.01.2005, 14:59
    #32882567
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
Грасов - а с хашем получается так:
Код: 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
25.01.2005, 15:30
    #32882652
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
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
25.01.2005, 15:40
    #32882680
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
еслиб я ещё умел тестить...

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

выполняешь код 10000 раз на большом пердложении из русского
текста и замеряешь время в обоих случаях.
...
Рейтинг: 0 / 0
25.01.2005, 16:19
    #32882821
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
Только тестировать лучше такой код.
Код: 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
25.01.2005, 17:57
    #32883117
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
при тесте на моём файле (много коротких строчек) и числе повторов 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
25.01.2005, 18:19
    #32883176
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
Я заметил что в примере с хашем я вызываю метод который заполняет хэш до того как засекаю время но после переноса ничего не изменилось - то есть put-ы не тормозят
Код: plaintext
1.
2.
3.
4.
  try  {
             long  i;
            i = System.currentTimeMillis();
dict()
...
Рейтинг: 0 / 0
26.01.2005, 13:34
    #32884578
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
translit
Разумный результат.
Вариант с массивами не оптимален с самого начала, т.к. используется линейный поиск элемента.
Если воспользоваться binary search, то думаю будет сильный вин %)

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


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