Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Получение массивов


Автор: _LEM_ 14.3.2007, 12:41
Хотелось бы узнать о этих способах в J2ME.
Т.к в j2se нашёл только StringTokinezer и то грамозкий способ =)
В j2me вообще ни чего путного не нашёл.

Автор: W0LF 14.3.2007, 12:45
smile Читаем файлик, парсим, загоняем все в массив. Просто и сердито smile

Автор: Dancer 14.3.2007, 12:50
_LEM_, я же тебе на другом форуме готовый метод привёл, бери и пользуй smile)
Ну, нету в j2me ничего похожего на StringTokenizer, понимаешь, НЕТУ!!!
http://forum.sources.ru/index.php?showtopic=173254

Если тебе нужно именно так, как организован класс StringTokenizer в J2SE, то возьми мой метод за основу и сделай свой собственнй класс. (где-то у меня был такой уже говтовый, но боюсь искать буду дольше чем его писать) Главное не забудь сделать implemets Enumeration для своего класса. 

Если с Vector работать нельзя, не хочешь, не умеешь (нужное подчекнуть), то можешь привести всё это дело в массив

String s="aaa,,bbb,ccc,,,";
Vector vec = stringTokenizer(s,",,");
String strArray[] = new String[vec.size()];
for(Enumeration el = vec.elements(), int i=0; el!=null && el.hasMoreElements();strArray[i++]=el.nextElement()));

Автор: _LEM_ 14.3.2007, 19:47
Dancer, Я там те хотел написать ,но не могу войти.
Так вот Stringtokinezer тоже не то.
Неужели в java что бы тупо получить массив из строки нужно так мудиться:
 
Код
String s="aaa,,bbb,ccc,,,";
Vector vec = stringTokenizer(s,",,");
String strArray[] = new String[vec.size()];
for(Enumeration el = vec.elements(), int i=0; el!=null && el.hasMoreElements();strArray[i++]=el.nextElement()));

уж0с.
Вот думаю какие вообще есть способы , какие лучше ,что юзать сначало.
Вот есть мнение что парсинг рулит,неплохо бы привести пример -)
Просто для реализации моей задачи мне надо разделить строку ,потом разделённую строку ещё раз разделить -)
Если начальный код выглядит так что будет потом =)

Цитата(Dancer @  14.3.2007,  12:50 Найти цитируемый пост)
Если с Vector работать нельзя, не хочешь, не умеешь (нужное подчекнуть)
 Да нет,буду юзать весь язык по мере свободного времени, но желательно с того что полегче начать.

Автор: javastic 15.3.2007, 10:20
_LEM_, ну напиши себе свой собственный метод который будет разделять строку на части и все дела. Потом используй где хочешь и сколько хочешь.

Автор: _LEM_ 15.3.2007, 11:17
Цитата(javastic @  15.3.2007,  10:20 Найти цитируемый пост)
 ну напиши себе свой собственный метод который будет разделять строку на части и все дела. Потом используй где хочешь и сколько хочешь.

Дык и спрашиваю как это сделать, субсторами и индексоф не выйдёт.
т.к. вид такой:
data||data||data
data||data||data
Надо разбить по переносу,потом по || каждую строку, причём их кол - во неизвестно, эти данные беруться от сервера.

Добавлено @ 11:19 
Кстати от сервера могу как угодно выдать данные , поэтому и консультируюсь на счёт способов получения массивов.

Автор: javastic 15.3.2007, 12:52
Ну дык и всё. Начало такое:
Код

public String[] getArrayString(String s, String separator) {
  // и в цикле разбираешь ...
}


а дальше сам

Автор: Dancer 16.3.2007, 13:58
Цитата(_LEM_ @ 15.3.2007,  11:17)
Дык и спрашиваю как это сделать, субсторами и индексоф не выйдёт.
т.к. вид такой:
data||data||data
data||data||data
Надо разбить по переносу,потом по || каждую строку, причём их кол - во неизвестно, эти данные беруться от сервера.

Дык так и делай smile))

String s=.... ;// это твоя прочитанная строка из файла или ещё откуда
Vector vecLines = stringTokenizer(s,"\n");  //первое разделение, на строки.
String strArray[][] = new String[vecLines.size()][];
for(Enumeration el = vecLines.elements(), int i=0; el!=null && el.hasMoreElements();i++) {
    Vector v = stringTokenizer((String)el.nextElement(),"||"));
    strArray[i] = new String(v.size());
    for(Enumeration e = v.elements(), int j=0; e!=null && e.hasMoreElements();strArray[i][j++]=e.nextElement());
    v = null;
}

Автор: javastic 16.3.2007, 14:03
Dancer, походу человек хочет получить уже написанный код чтобы не париться. smile

Автор: Dancer 16.3.2007, 14:39
ды ёпрст! smile по ссылке если зайти, там уже готовый код метода. Я ему это на другом форуме писал. Этот метод получает строку, и разделитель, выводит Vector, каждый элемент такого вектора это строка, полученная из исходной путём разделения по указанным пользователем разделителям. Здесь, я ему уже реализацию написал с помощью имеющегося на другом сайте (смотри ссылку) метода. Ему нужно лишь это в свою аппликуху воткнуть. Ну уж если и это трудно smile), тогда вряд ли тут поможешь. (дело даже не в "голове") smile

Автор: Dancer 16.3.2007, 18:08
в моём методе stringTokenizer у меня была допущена маленькая ошибочка (писал на "коленке"). Сейчас вот полностью нормальный, рабочий и правильный код.
Код

import java.util.*;

public class test {
    public static void main(String str[]) {
        String s="data0_0||data0_1\ndata1_0||data1_1||data1_2||data1_3\ndata2_0";// это твоя прочитанная строка из файла или ещё откуда
        Vector vecLines = stringTokenizer(s,"\n");  //первое разделение, на строки.
        String strArray[][] = new String[vecLines.size()][];
        int i_iterator=0;
        for(Enumeration el = vecLines.elements(); el!=null && el.hasMoreElements();i_iterator++) {
            Vector v = stringTokenizer((String)el.nextElement(),"||");
            strArray[i_iterator] = new String[v.size()];
            int j_iterator=0;
            for(Enumeration e = v.elements(); e!=null && e.hasMoreElements();strArray[i_iterator][j_iterator++]=(String)e.nextElement());
            v = null;
        }
        for(int i=0;i<strArray.length;i++) {
            Log("Strorka "+i);
            for(int j=0;j<strArray[i].length;j++) {
                 Log("element["+i+"]["+j+"]="+strArray[i][j]);
            }
            Log("==================");
        }
    }

    private static void Log(String str) {
        System.out.println(str);
    }

   public static Vector stringTokenizer(String str, String delimetr) {
        if(str==null || delimetr==null) return null;
        if(delimetr.equals("")) {
            Vector v = new Vector(0,1);
            v.addElement(str);
            return v;
        }

        Vector tmp = new Vector(0,1);
        String tmpStr;
        int start=0,index=0;

        while((index=str.indexOf(delimetr,index)) > -1) {
            tmpStr=str.substring(start,index);
            if(!tmpStr.trim().equals("")) {
                tmp.addElement(tmpStr);
            }
            start=index+delimetr.length();
            index=start;
        }

        if(start<str.length()) {
            if(!str.substring(start).trim().equals("")) {
                tmp.addElement(str.substring(start).trim());
            }
        }

        if(tmp.size() > 0) {
            return tmp;
        }

        return null;
    }


}

Автор: _LEM_ 17.3.2007, 12:47
javastic, Те часть ответа дал Dancer, вот я добавлю,что тупо списать это не выход для меня.
Даже больше , я не просил ни каких готовых методов,хотя спасибо конечно.
Цитата(javastic @  16.3.2007,  14:03 Найти цитируемый пост)
 походу человек хочет получить уже написанный код чтобы не париться

Даже обидно -(
Делаю свой набросок ,но так в J2ME нович0г ,ни фига не выходит
Код


int element = 0;
int start = 0;
int next;
String tmpstring;
String while = "while";
/* Не знаю какой тип указать ,буду писать везде array */
array arr;


array explode (Sting razdelitel,String stroka)
{
while (while == "OFF")
{
tmpstring = stroka.substring (start);
next = tmpstring.indexof(razdelitel);
if (next<>-1)
{
arr[] = tmpstring.substring(0,next);
}
else
{
arr[] = tmpstring;
break;
}
start = next;
}
return arr;
}
/* ВотЬ..
Ошибок наверное тьма, заместо array я не знаю чё ставить наверное Vector
И где start = next+1; наверное надо было записать.



Автор: W0LF 17.3.2007, 15:25
Цитата(_LEM_ @  17.3.2007,  12:47 Найти цитируемый пост)
но так в J2ME нович0г

1. Отбросим технологию j2me
Цитата(_LEM_ @  17.3.2007,  12:47 Найти цитируемый пост)
String while = "while";

while - это зарезервированное слово, нельзя так писать.
Cначала нужно выучить язык. А потом учить технологию.
Брюс Эккель - "Философия Java" 3 издание. Хорошая книга ИМХО

Автор: _LEM_ 17.3.2007, 18:09
Хе, про php тоже так говорили,но тем не менее я освоил его без учебников и с обычного сотового телефона ;-)
-
Зарезервиванно ,но обьявленно же как обьект String, если так низя ,то очень хорошо ,уже знаю что так нельзя -)
-
Допустим написал
String whilee = "whilee"; // smile
Что на счёт массива скажете?

Автор: W0LF 17.3.2007, 19:45
В твоем случае ты не знаешь, сколько будет элементов. Vector - это динамический массив. Так что юзай его

Автор: _LEM_ 18.3.2007, 10:01
Ок, теперь код такой:
Код

int element = 0;    
int start = 0;    
int next;    
String tmpstring;    
String cikl = "__----__";    
Vector arr;    
Vector explode (Sting razdelitel,String stroka)    
{    
while (cikl == "OFF")    
{    
tmpstring = stroka.substring (start);    
next = tmpstring.indexof(razdelitel);    
if (next<>-1)    
{    
arr.add(tmpstring.substring(0,next));    
}    
else    
{    
arr.add(tmpstring);    
break;    
}    
start = next; // Тут next+1 надо?    
}    
return arr;    
}

Где ещё накосячил тоже пишите -)

Автор: W0LF 18.3.2007, 15:29
Извини, но наверно тут никто не захочет следить за всеми твоими "косяками".
Я же говорю - синтаксис языка надо хотя бы знать(не равно в java - "!=")
Ставь jsdk, jde и в перед. Если у тебя будет Intellij Idea, то она отлично на этапе написания кода показывает все твои ошибки. А если залезть там в настройки синтаксического анализатора, то она тебе будет показывать и логические ошибки типа таких - 
Код

if (b) {
    return true;
} else {
    return false;
}

и будет говорить как их убрать.
Плюс не забывай читай книгу.

Автор: _LEM_ 18.3.2007, 16:45
Цитата(W0LF @  18.3.2007,  15:29 Найти цитируемый пост)
Извини, но наверно тут никто не захочет следить за всеми твоими "косяками".
Хе, ну тут вроде как форум ,код не большой  и простой,на ошибки указать можно я думаю.
Вообще не надо мне приписывать лишнее ;-) Я не прошу следить за "всеми косяками" ;-)

Цитата(W0LF @  18.3.2007,  15:29 Найти цитируемый пост)
Я же говорю - синтаксис языка надо хотя бы знать(не равно в java - "!=")

Странно ,у меня в учебнике написанно что и <> тоже можно.

Цитата(W0LF @  18.3.2007,  15:29 Найти цитируемый пост)
Ставь jsdk, jde и в перед.
Стоит уже ;-)
показывает, что ошибка smile как исправить не всегда , и не всегда так как мне надо.



Цитата(W0LF @  18.3.2007,  15:29 Найти цитируемый пост)
Плюс не забывай читай книгу.

Читаю аж 3 =) 
2 по jse (там синтаксис смотрю) описание языка уже прочитал.
и 1 по jme там криво всё описанно но понять можно.

Вообщем <> заменить , остальное правильно?  next+1 надо?


Автор: _LEM_ 18.3.2007, 17:29
Всё ,вроде привёл в порядок код, хотел проверить внаписал:
Код

import javax.microedition.lcdui.*;    
import javax.microedition.midlet.*;
import java.util.*; 


public class Midlet extends MIDlet {    
Display d = Display.getDisplay(this);
Form form = new Form ("Test MIDlet");
String str = "data|data|data";
String ex = "|";
String cikl = null;
int start = 0;
int next = 0;

Vector arr;
String razdelitel,stroka,tmpstring,nadispley;
Vector explode (String razdelitel,String stroka)     
{     
while (cikl == "OFF")     
{     
tmpstring = stroka.substring (start);     
next = tmpstring.indexOf(razdelitel);     
if (next!=-1)     
{     
arr.addElement(tmpstring.substring(0,next));     
}     
else     
{     
arr.addElement(tmpstring);     
break;     
}     
start = next; // Тут next+1 надо?     
}    
return arr;     
}

    public void startApp () {
    Vector vec = explode ("|",str);
    int count = vec.size();
    for (int i = 0; i <= count; i++)
    {
        nadispley += i+"=>"+vec.elementAt(i);
    }
    System.out.println (nadispley);
    form.append(nadispley);
    d.setCurrent(form);
    }
    public void pauseApp () {}
 public void destroyApp (boolean destroy) { notifyDestroyed(); }
    
}
Эмулятор ни чего не показывает...

Автор: W0LF 18.3.2007, 19:58
Цитата(_LEM_ @  18.3.2007,  16:45 Найти цитируемый пост)
Хе, ну тут вроде как форум ,код не большой  и простой,на ошибки указать можно я думаю.

С этими ошибками тебе в раздел - "Общая java"


M
W0LF
Правила форума: http://forum.vingrad.ruhttp://forum.vingra...ct-SR/f-27.html

Цитата

Код

while (cikl == "OFF") {


У тебя изначально "cikl" равен "null", а если так, то 
Цитата

Код

return arr;


мы возвращаем "null" так как
Цитата

Код

Vector arr;


не инициализирован!
Итог этого всего - NullPointerException!

Автор: _LEM_ 19.3.2007, 00:14
подписал
Vector arr = new Vector();
и cikl = "nullll"; хотя не понимаю зачем это.всё равно цикл работать будет пока не оборву - break;
т.к условие не выполниться.
Результат не изменился - пустой экран.
Среда пишет:
startApp threw an Exception
java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
        at java.util.Vector.elementAt(Vector.java:432)
        at Midlet.startApp(Midlet.java:43)
        at javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:46)
        at com.sun.midp.midlet.Scheduler.schedule(+270)
        at com.sun.midp.main.Main.runLocalClass(+28)
        at com.sun.midp.main.Main.main(+116)
Execution completed.
727502 bytecodes executed
26 thread switches
741 classes in the system (including system classes)
3826 dynamic objects allocated (114656 bytes)
2 garbage collections (89732 bytes collected)
BUILD SUCCESSFUL (total time: 10 seconds)
----------------------------------------------
Цитата(W0LF @  18.3.2007,  19:58 Найти цитируемый пост)
С этими ошибками тебе в раздел - "Общая java"
Ага,там мне предложат просто использовать StringTokinezer =D
В учебнике например написанно что добавить элемент можно add ну ещё addElement , на add среда ругаеться на addElement - нет. Типа особенность j2me => раз уж пишу под мобилу обращаюсь в соответствующий раздел.
Понимаю,надо показать что ты модер , но давай не будем отклоняться от темы лишний раз ;-) 

Автор: W0LF 19.3.2007, 05:04
Сделай так - 
Код

String cikl = "OFF";

а в цикле оставь - 
Код

while (cikl == "OFF")

Я так понял ты сделал следующее - 
Цитата

String cikl = null;
while (cikl == "null")

?
Короче, на тебе МЕшный http://alexander.lonsky.googlepages.com/StringTokenizer.java
Специально для тебя переделал. тока он не работает с UTF-8. Поддерживает чисто инглишь так как времени нет! Он полностью идентичен тому 
Цитата

StringTokinezer
 из большой явы, только строки на английском ему суй. 
Вот, я думаю вопрос исчерпан?!?
Цитата

Понимаю,надо показать что ты модер

Я ничего никогда не показываю просто так!

Автор: W0LF 19.3.2007, 05:49
реализация на всякий случай - 
Код

StringTokenizer st = new StringTokenizer("this||is||a||test","||");
Vector words = new Vector();
        while (st.hasMoreTokens()) {
            words.addElement(st.nextToken()); 
        }

Все, юзай на здоровье.

Автор: _LEM_ 19.3.2007, 10:29
Цитата(W0LF @  19.3.2007,  05:04 Найти цитируемый пост)
Вот, я думаю вопрос исчерпан?!?
Нет, моя реализация выше. Готовый мне не надо.
Dancer уже дал готовый метод тем более =)


Цитата(W0LF @  19.3.2007,  05:04 Найти цитируемый пост)
Сделай так - 
String cikl = "OFF";    

а в цикле оставь - 
while (cikl == "OFF")    

Я так понял ты сделал следующее - 
String cikl = null;
while (cikl == "null")
 нет -)
Сейчас вообще написал int cikl = 0;
А в цикле
while (cikl <= 99999999)
т.к. 
Цитата(_LEM_ @  19.3.2007,  00:14 Найти цитируемый пост)
 цикл работать будет пока не оборву - break;

то есть пока next = tmpstring.indexOf(razedlitel); не станет == -1
-----------
Ужё чё тока не пробовал - пустой экран.
-----------

PS: на всякий - интересует тока моя функция или стандартные j2me.
Тупо списывать не чего не понимая - не для меня.


Автор: javastic 19.3.2007, 10:51

 ! 
javastic
_LEM_, общие вопросы программирования на Яве просьба писать в раздел Общее.
Если нужен алгоритм, то в раздел Алгоритмы. Не надо засорять эту ветку.

Автор: Dancer 19.3.2007, 11:37
    int count = vec.size();

    int count = vec.size()-1;

чувствуешь разницу? smile) 
Допустим, ветор у нас сейчас заполнен 10 элементами, size() тебе вернёт, что в векторе 10 элементов. а перебираться то они будут с 0 до 9.  (учим мат.часть) smile
На дальнейшее, лучше ползьзуй так как я это пользовал, через nextElemenent(). (один раз поймёшь, далее всё просто будет) 
В j2ME нету add метода у вектора, есть лишь addElement() - это так.

while (cikl == "OFF") 
нахрена тебе это? проще вроде бы так while (true)  - вроде бы ты это и имел ввиду.
переменные start,next,arr внеси в свой метод, они же у тебя локальные. Так же не забудь проинициализировать arr = new Vector() - хотябы так. в начале работы твоего метода. (а то хорошего ничего не будет)

Автор: _LEM_ 19.3.2007, 22:22
Цитата(Dancer @  19.3.2007,  11:37 Найти цитируемый пост)
 а перебираться то они будут с 0 до 9.  (учим мат.часть) 
Я знал,думал просто один будет пустой.


Цитата(Dancer @  19.3.2007,  11:37 Найти цитируемый пост)
while (cikl == "OFF") 
нахрена тебе это?
Просто тупое условие которое не выполниться,что бы цикл работал.
Цитата(Dancer @  19.3.2007,  11:37 Найти цитируемый пост)
На дальнейшее, лучше ползьзуй так как я это пользовал, через nextElemenent(). (один раз поймёшь, далее всё просто будет) 
Я Vector юзаю. Про енумератион не слышал и не думаю что он мне нужен,т.к динамический массив мне лучше для реализации.
Цитата(Dancer @  19.3.2007,  11:37 Найти цитируемый пост)
переменные start,next,arr внеси в свой метод, они же у тебя локальные. Так же не забудь проинициализировать arr = new Vector() - хотябы так. в начале работы твоего метода.
 Это сделал уже, просто не отписывал тут. Что не сообщение - пердупреждение =) не любят тут новичков -)
Цитата(Dancer @  19.3.2007,  11:37 Найти цитируемый пост)
 (а то хорошего ничего не будет)
Да и сейчас нету =) Вроде ошибок нету (даже консоль не ругаеться),а экран пустой.
http://hostwap.info/trash/j2me.txt - текущая версия кода.

Автор: Dancer 20.3.2007, 12:02
disp +=vec.elementAt(i);

disp +=(String)(vec.elementAt(i));

Добавлено @ 12:10 
Да, ещё. возвращаясь к cikl - убери его. он тебе совершенно не нужен.
Код

public Vector explode (String razd,String str)
{
    Vector arr = new Vector();
    String tmp = "";
    String tmptwo = "";
    int cikl = 0;
    int start = 0;
    int next = 0;
    
    while (cikl <= 99) 
    {
        tmp = str.substring (start);
        next = tmp.indexOf(razd);
        
        if (next > -1) 
        {
            tmptwo = tmp.substring(0,next);
            arr.addElement(tmptwo);
         
        }
        else 
        {
        arr.addElement(tmp);
        break;
        }
        start +=next+razd.length();
        
    }
    return arr;
}


и ещё маленькое дополнение, не форматируй Java код как Cи smile, очень не четабельно.
рекомендации по форматированию можешь посмотреть у Sun

Код

    public Vector explode (String razd,String str) {
        Vector arr = new Vector();
        String tmp = "";
        String tmptwo = "";
        int start = 0;
        int next = 0;
    
        while (true) {
            tmp = str.substring (start);
            next = tmp.indexOf(razd);
        
            if (next > -1)  {
                tmptwo = tmp.substring(0,next);
                arr.addElement(tmptwo);
            } else  {
                arr.addElement(tmp);
                return arr;
            }
            start +=next+razd.length();
        }

    }


у меня твой код работает (в общем и целом)

Автор: _LEM_ 20.3.2007, 14:29
Dancer, Ага поставил (String) заработало - спасибо!!
Кстати в каких случаях ставиться (тип) я же вроде строку и добавлял в массив. На выходе надо всё равно указывать?
Цитата(Dancer @  20.3.2007,  12:02 Найти цитируемый пост)
и ещё маленькое дополнение, не форматируй Java код как Cи , очень не четабельно.
Не знаю на Си могу не пишу smile Тока на php.


Цитата(W0LF @  19.3.2007,  05:04 Найти цитируемый пост)
Вот, я думаю вопрос исчерпан?!?
Теперь исчерпан -)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)