Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Позиционирование в файле 
V
    Опции темы
WildChild
Дата 28.3.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 24.8.2005
Где: Российская Федера ция

Репутация: нет
Всего: нет



допустим есть файл (это только пример, на самом деле он больше)
Структура файла:
Код

eng_word1:rus_trans1
eng_word2:rus_trans2
.
.
eng_wordN:rus_transN


Как позиционироваться в файле, чтобы можно было начинать не с начала файла, а из произвольного места?
Вывод на экран мобилы должен быть, приблизительно, такой:
Код

eng_word
rus_trans


Спасибо!
--------------------
Don't give up without even trying
PM MAIL   Вверх
powerOn
Дата 29.3.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Попробуй вначале все данные из файла прочитать в массив. Потом с поизвольно места читаь легко сможешь.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Dancer
Дата 29.3.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



какой массив, не вздумай!!! (я там понимаю никакой памяти в телефоне не хватит, если ты будешь не хилый словарик держать в телефоне. просто напросто приложение по OutOfMemory загнётся.
Есть метод тайкой как skip() точно не помню, нужно будет проверить, вот если тебе это подойдёт, то ты можешь узнать размер твоего файлика и пропустить первые N байт, потом начать читать с N+1 байта. (это если JSR-75 используешь и файлик у тебя в файловой системе телефона валяется)
Если же файлик ты таскаешь вместе со своим мидлетом, то у тебя есть InputStream скорее всего на этот файлик, там то же можно skip(long n) применить.

---------------
smile читаем доки.......
Добавлено @ 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


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
redrick
Дата 29.3.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 1
Всего: 5



MoonCat, если размер файла действительно большой, то я бы поостерегся весь его читать в массив(10кб юникода это на самом деле даже не страница). Предлагаю запомнить в массиве просто смещения в байтах каждой строчки.


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Dancer
Дата 29.3.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



redrick, не плохое решение про хранить в массиве смещения, но тогда уже лучше делать второй файлик, зависимый от нашего файла словаря, то есть если внесли изменения в словарь, то запускаем скрип (ну, или кто что напишет), который бегает по нашему словарю и запихивает в другой фалик смещения для каждой строчки (возможно даже лучше писать ID для этой строчки и смещение к этой строчки. В словаре сначала будет идти ID слова далее eng:rus\n)
тогда можно будет позиционироваться по строчками и если сделать хорошую функцию создания ID для слова (в Кнуте не плохо данные алгоритмы описаны) то позиционироваться по файлику словаря будет достаточно легко. Самая загвоздка при создании хешей - это конечно решение коллизий, но это уже тема не этой беседы smile


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
powerOn
Дата 29.3.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Цитата

какой массив, не вздумай!!! (я там понимаю никакой памяти в телефоне не хватит, если ты будешь не хилый словарик держать в телефоне. просто напросто приложение по OutOfMemory загнётся.


smile О размере файла ничего конкретного сказано не было.

Более того, поиск через постоянные операции файлового ввода вывода не эффективен.
Если речь идет о действительно большом словаре, то предлагаю немного поменять структуру файла.
Дополнить например ее какими либо методанными по которым можно ускорить поиск. Например, вначале
файла хранить таблицу, где обозначить с какой позиции начинаются слова на определенную букву. Или вообще разбить словарь на несколько файлов для каждой начальной буквы, ну и таком духе....


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
WildChild
Дата 29.3.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 24.8.2005
Где: Российская Федера ция

Репутация: нет
Всего: нет



MoonCat, Dancer, redrick, спасибо большое за помощь!

MoonCat, извини! Я не указал размер файла и тебе досталось. Sorry! В следующий раз буду повнимательней!
На самом деле размер файла будет колебаться от 10 до N (в разумных пределах) слов.

Dancer
Цитата

<eng_word ID = "123456789">mother</eng_word>
<rus_word ID = "123">мама</rus_word>

ID русского и английского слов НЕ должы совпадать?

Цитата

первые N байт, потом начать читать с N+1 байта

Я пробывал... Если попадаешь в середину байта, то очень не хорошая вещь получается...
Можно, конечно, дальше читать до \n, ну и так далее. Но, сильно муторно...

Это сообщение отредактировал(а) WildChild - 29.3.2006, 16:06
--------------------
Don't give up without even trying
PM MAIL   Вверх
Dancer
Дата 29.3.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



ну, насчёт того должны эти ID совпадать или нет - не знаю. Если к примеру ты делаешь какую-то хитрую универсальную хеш функцию, то на вход подаёшь слово на любом языке, получаешь ID ищешь это ID и переводишь слово на любой доступный язык из твоего файлика.
Если же тебе нужно чётко с английского на русский, то наверное лучше чтобы ID совпадали. (я же говорил, что это дано лишь для примера, и никак не руководство к действию. Как лучше организовать логику уже тебе думать (и выбирать, мне так кажется)

Вот про то что мы попадем на серидину байта не совсем понял - это как?
читаем то мы постоянно побайтно, так что прочить полбайта и остановиться просто не можем. (ты как себе такое представляешь. Реально видел такие ситуации?)



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
WildChild
Дата 29.3.2006, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 24.8.2005
Где: Российская Федера ция

Репутация: нет
Всего: нет



Я ошибся, сказав, что попадаю в середину байта.
Наверное, в середину UTF символа, если так можно сказать. Ну в общем, не работало...

Ошибку свою понял.
--------------------
Don't give up without even trying
PM MAIL   Вверх
WildChild
Дата 30.3.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 24.8.2005
Где: Российская Федера ция

Репутация: нет
Всего: нет



Есть вот такой код
Код

  public void startApp() {
    Random r = new Random();
    try {
      parser.setInput(reader); //назначим парсеру источник данных
    } catch (XmlPullParserException e) {
      System.out.println("Не удалось связать парсер с потоком данных");
    }
    while (doJob) {
        int number = 0;
        number = (int)(10 * r.nextDouble());
      try {
        event = parser.next(); //переместим курсор на следующий элемент документа
        name = parser.getName(); //получим имя этого элемента
        if (event == KXmlParser.END_DOCUMENT) {
          doJob = false;
          break;
        }
        if ((event == KXmlParser.START_TAG) && (name.startsWith("trunk"))) {
            if (parser.getAttributeValue(0).equals(java.lang.Integer.toString(number))) {
                event = parser.next();
                name = parser.getName();
                //System.out.println(parser.getAttributeValue(0) + "    " + parser.getAttributeValue(1)); 
                if ((event == KXmlParser.START_TAG) && (name.startsWith("branch")))
                    System.out.println("    " + parser.getAttributeValue(0) + ":" + parser.getAttributeValue(1));
            }
        }
      } catch (XmlPullParserException e) {
        System.out.println("Во время парсинга с парсером случилось что-то нехорошее");
      } catch (IOException e) {
        System.out.println("Во время парсинга парсер потерял связь с источником данных");
      } catch (NullPointerException e) {
       System.out.println("Что-то не так!");
      }
    }
  }

На строку 23 (если её раскомментировать) WTK22 выдает ошибку
Код

startApp threw an Exception
java.lang.IndexOutOfBoundsException
java.lang.IndexOutOfBoundsException
    at org.kxml2.io.KXmlParser.getAttributeValue(+15)
    at MobileXmlParser.startApp(+156)
    at javax.microedition.midlet.MIDletProxy.startApp(+7)
    at com.sun.midp.midlet.Scheduler.schedule(+270)
    at com.sun.midp.main.Main.runLocalClass(+28)
    at com.sun.midp.main.Main.main(+116)

В if, на строке 24, не входит...
Текст xml-файла следующий
Код

<?xml version="1.0" standalone="yes"?>
<root>
      <trunk id="0">
              <branch eng="mother" rus="мама">
              </branch>
      </trunk>
    <trunk id="1">
        <branch eng="bad" rus="плохой">
        </branch>
    </trunk>
    <trunk id="2">
        <branch eng="live" rus="жить">
        </branch>
    </trunk>
</root>


В чем проблема, не могу понять... Может кто сталкивался
Работаю с kXML 2.2.
--------------------
Don't give up without even trying
PM MAIL   Вверх
redrick
Дата 30.3.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 1
Всего: 5



ну наверное у того элемента всего один атрибут, а не 2 (хотя вроде как это должен быть <branch>...)

чем гадать - залезь в дебагер да посмотри что на самом деле в parser в этой строчке


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
WildChild
Дата 30.3.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 24.8.2005
Где: Российская Федера ция

Репутация: нет
Всего: нет



Вот пример xml файла, из работающей программы взятой отсюда - http://lib.juga.ru/article/articleview/209/1/16/
Код

<?xml version="1.0" standalone="yes"?>
<root>
    <trunk id="0">
        <branch name="branch1" id="1">
            <!--This is a branch that belongs to our tree-->
        </branch>
        <branch name="branch2" id="2">
            <leaf name="leaf1" id="3"></leaf>
            <leaf name="leaf2" id="4"></leaf>
            <leaf name="leaf3" id="5"></leaf>
        </branch>
    </trunk>
</root>

--------------------
Don't give up without even trying
PM MAIL   Вверх
WildChild
Дата 31.3.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 24.8.2005
Где: Российская Федера ция

Репутация: нет
Всего: нет



Кажется я разобрался...
Нельзя повторно использовать
Код

event = parser.next();

Я так понимаю, что если его использовать повторно, то я попадаю сразу в конец документа...
То есть первый раз попадаю на <root>, а второй вызов - на </root>, а не на <trunk>.
Если я хочу гулять по тэгам, то необходимо делать следующее: smile
Код

event = parser.nextTag();

На том примере, что есть в данной теме я ещё не проверял. Проверил на другом - РАБОТАЕТ! smile
--------------------
Don't give up without even trying
PM MAIL   Вверх
redrick
Дата 31.3.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 1
Всего: 5



ну вот, "а ты боялась..." =)


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
WildChild
Дата 31.3.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 24.8.2005
Где: Российская Федера ция

Репутация: нет
Всего: нет



Думал, успею отредактировать свое сообщение... Ан нет. ;о)
Просто, неправильно работает код...
Буду ещё smile

Спасибо за поддержку!
--------------------
Don't give up without even trying
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.