![]() |
|
Модераторы: javastic, AntonSaburov |
![]()
|
|
| WildChild |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 24.8.2005 Где: Российская Федера ция Репутация: нет Всего: нет |
допустим есть файл (это только пример, на самом деле он больше)
Структура файла:
Как позиционироваться в файле, чтобы можно было начинать не с начала файла, а из произвольного места? Вывод на экран мобилы должен быть, приблизительно, такой:
Спасибо! --------------------
Don't give up without even trying |
||||
|
|||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: нет Всего: 159 |
Попробуй вначале все данные из файла прочитать в массив. Потом с поизвольно места читаь легко сможешь.
|
|||
|
||||
| Dancer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
какой массив, не вздумай!!! (я там понимаю никакой памяти в телефоне не хватит, если ты будешь не хилый словарик держать в телефоне. просто напросто приложение по OutOfMemory загнётся.
Есть метод тайкой как skip() точно не помню, нужно будет проверить, вот если тебе это подойдёт, то ты можешь узнать размер твоего файлика и пропустить первые N байт, потом начать читать с N+1 байта. (это если JSR-75 используешь и файлик у тебя в файловой системе телефона валяется) Если же файлик ты таскаешь вместе со своим мидлетом, то у тебя есть InputStream скорее всего на этот файлик, там то же можно skip(long n) применить. --------------- Добавлено @ 12:57 да, лучше всего думаю для твоей структуры хранения подойдёт XML (для мобилок есть библиотечка kXML. Очень не плохая штука http://kxml.sourceforge.net) Так что сделаешь либо хеш функцию для вычисления ID английского слова и это ID у тебя будет как атрибут в XML тэге, по этому атрибуту будешь искать превод слова. что-то наподобие <dict> <word> <eng_word ID = "123456789">mother</eng_word> <rus_word ID = "123">мама</rus_word> </word> </dict> Хотя конечно, структуру делаешь так, как подскажет здравый смысл и опыт (то что выше это просто пример и ничего более), далее расширение на другие языки можно будет делать достаточно просто, ну и соответственно все буковки естественно лучше всего будет писать в уникоде /uXXXX -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! |
|||
|
||||
| redrick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 1 Всего: 5 |
MoonCat, если размер файла действительно большой, то я бы поостерегся весь его читать в массив(10кб юникода это на самом деле даже не страница). Предлагаю запомнить в массиве просто смещения в байтах каждой строчки.
-------------------- Имею Мнение Хрен Оспоришь |
|||
|
||||
| Dancer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
redrick, не плохое решение про хранить в массиве смещения, но тогда уже лучше делать второй файлик, зависимый от нашего файла словаря, то есть если внесли изменения в словарь, то запускаем скрип (ну, или кто что напишет), который бегает по нашему словарю и запихивает в другой фалик смещения для каждой строчки (возможно даже лучше писать ID для этой строчки и смещение к этой строчки. В словаре сначала будет идти ID слова далее eng:rus\n)
тогда можно будет позиционироваться по строчками и если сделать хорошую функцию создания ID для слова (в Кнуте не плохо данные алгоритмы описаны) то позиционироваться по файлику словаря будет достаточно легко. Самая загвоздка при создании хешей - это конечно решение коллизий, но это уже тема не этой беседы -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: нет Всего: 159 |
Более того, поиск через постоянные операции файлового ввода вывода не эффективен. Если речь идет о действительно большом словаре, то предлагаю немного поменять структуру файла. Дополнить например ее какими либо методанными по которым можно ускорить поиск. Например, вначале файла хранить таблицу, где обозначить с какой позиции начинаются слова на определенную букву. Или вообще разбить словарь на несколько файлов для каждой начальной буквы, ну и таком духе.... |
|||
|
||||
| WildChild |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 24.8.2005 Где: Российская Федера ция Репутация: нет Всего: нет |
MoonCat, Dancer, redrick, спасибо большое за помощь!
MoonCat, извини! Я не указал размер файла и тебе досталось. Sorry! В следующий раз буду повнимательней! На самом деле размер файла будет колебаться от 10 до N (в разумных пределах) слов. Dancer
ID русского и английского слов НЕ должы совпадать?
Я пробывал... Если попадаешь в середину байта, то очень не хорошая вещь получается... Можно, конечно, дальше читать до \n, ну и так далее. Но, сильно муторно... Это сообщение отредактировал(а) WildChild - 29.3.2006, 16:06 --------------------
Don't give up without even trying |
||||
|
|||||
| Dancer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
ну, насчёт того должны эти ID совпадать или нет - не знаю. Если к примеру ты делаешь какую-то хитрую универсальную хеш функцию, то на вход подаёшь слово на любом языке, получаешь ID ищешь это ID и переводишь слово на любой доступный язык из твоего файлика.
Если же тебе нужно чётко с английского на русский, то наверное лучше чтобы ID совпадали. (я же говорил, что это дано лишь для примера, и никак не руководство к действию. Как лучше организовать логику уже тебе думать (и выбирать, мне так кажется) Вот про то что мы попадем на серидину байта не совсем понял - это как? читаем то мы постоянно побайтно, так что прочить полбайта и остановиться просто не можем. (ты как себе такое представляешь. Реально видел такие ситуации?) -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! |
|||
|
||||
| WildChild |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 24.8.2005 Где: Российская Федера ция Репутация: нет Всего: нет |
Я ошибся, сказав, что попадаю в середину байта.
Наверное, в середину UTF символа, если так можно сказать. Ну в общем, не работало... Ошибку свою понял. --------------------
Don't give up without even trying |
|||
|
||||
| WildChild |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 24.8.2005 Где: Российская Федера ция Репутация: нет Всего: нет |
Есть вот такой код
На строку 23 (если её раскомментировать) WTK22 выдает ошибку
В if, на строке 24, не входит... Текст xml-файла следующий
В чем проблема, не могу понять... Может кто сталкивался Работаю с kXML 2.2. --------------------
Don't give up without even trying |
||||||
|
|||||||
| redrick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 1 Всего: 5 |
ну наверное у того элемента всего один атрибут, а не 2 (хотя вроде как это должен быть <branch>...)
чем гадать - залезь в дебагер да посмотри что на самом деле в parser в этой строчке -------------------- Имею Мнение Хрен Оспоришь |
|||
|
||||
| WildChild |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 24.8.2005 Где: Российская Федера ция Репутация: нет Всего: нет |
Вот пример xml файла, из работающей программы взятой отсюда - http://lib.juga.ru/article/articleview/209/1/16/
--------------------
Don't give up without even trying |
|||
|
||||
| WildChild |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 24.8.2005 Где: Российская Федера ция Репутация: нет Всего: нет |
Кажется я разобрался...
Нельзя повторно использовать
Я так понимаю, что если его использовать повторно, то я попадаю сразу в конец документа... То есть первый раз попадаю на <root>, а второй вызов - на </root>, а не на <trunk>. Если я хочу гулять по тэгам, то необходимо делать следующее:
На том примере, что есть в данной теме я ещё не проверял. Проверил на другом - РАБОТАЕТ! --------------------
Don't give up without even trying |
||||
|
|||||
| redrick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 1 Всего: 5 |
ну вот, "а ты боялась..." =)
-------------------- Имею Мнение Хрен Оспоришь |
|||
|
||||
| WildChild |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 24.8.2005 Где: Российская Федера ция Репутация: нет Всего: нет |
Думал, успею отредактировать свое сообщение... Ан нет. ;о)
Просто, неправильно работает код... Буду ещё Спасибо за поддержку! --------------------
Don't give up without even trying |
|||
|
||||
![]()
|
FAQ раздела лежит здесь! |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java ME (J2ME) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |