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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про структуру вектора (Vector) 
:(
    Опции темы
OlegRu
Дата 7.12.2005, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите новичку:
может ли Вектор содержать в своих элементах другие векторы?

Например так:

Код

Vector Var=new Vector(0, 1); // имя переменной
Vector Value=new Vector(0, 1); // значения переменной
Vector A=new Vector(1, 1); // общий динамический массив переменных и их значений

Var.addElement("1");
Var.addElement("2");

Value.addElement("5");
Value.addElement("6");
Value.addElement("7");

A.addElement(Var);
A.addElement(Value);


Я так понимаю, что A теперь имеет такую структуру:
A:
[0]-> [1,2]
[1]->[5,6,7]

А как теперь дописать в А[0] еще один элемент "3" ? Чтобы было [0]-> [1,2,3].

Это я решаю такую "локальную" задачу как парсинг строки с именами переменных и их значениями. Напр. есть динамическая строка (с неизвестным кол.-м переменных): Str="X1=1,3,5;Y=some_text;A2=150;". Я хочу на выходе получить динамический массив (например, Вектор) в виде:
A[0][0]-> "X1" <- Var[0]
A[0][1]-> "Y" <- Var[1]
A[0][2]-> "A2" <- Var[2]
A[1][0]-> "1" <- Value[0]
A[1][1]-> "3" <- Value[1]
A[1][2]-> "5" <- Value[2]
A[2][0]-> "some_text" <- Value[0]
A[3][0]-> "150" <- Value[0]

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

P.S. Эту задачу я решаю на J2ME, а не Java.

Это сообщение отредактировал(а) Lamer George - 7.12.2005, 17:44
PM MAIL   Вверх
Sardar
Дата 7.12.2005, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Да можно, т.к. Vector это обьект и сам хранит обьекты.

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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
OlegRu
Дата 7.12.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



To Sardar
Спасибо, конечно, за подсказку про рег. выражения, но я буду очень сильно удивлен, если мне скажут, что в J2ME MIDP 2.0 они работают.

Всем спасибо за участие.
Вот я дописал свою функцию. Если кому надо,- то берите.
Смысл заключался в том, что: сервер передал на мобилу набор переменных в виде строки S, которая должна быть, например, такого формата:
S="Var1=5,7,3,;Var2=5,8,;Var3=text..text,;".
А функция split расщепляет ее по именам и значениям переменных и заносит в вектор V.
Если кто делал красивее или компактнее под J2ME - поделитесь, плиз. (хотя эта версия мне нравится smile )

Код

public Vector split(String S)
{       
    char symbol; // каждый символ строки S
    String var=""; // сюда заносится имя переменной
    String val=""; // сюда заносятся значения(ие) переменной
    boolean f1=true; // работаем с именем переменной (если true)
    boolean f2=false; // работаем со значением переменной (если true)
    Vector Var=new Vector(); // накапливает имена переменных  
    Vector Value=new Vector(); // накапливает значения переменной  
    Vector V=new Vector(1); // результат парсинга строки

    int i=0;
    while (i < S.length())
    {   
        symbol=S.charAt(i);
               
        switch ( symbol ){
        case '=':
            Var.addElement(var);
            var = "";                         
            Value = new Vector();            
            f1 = false; f2 = true;              
        break;
        case ',':
            Value.addElement(val);
            val = "";
        break;
        case ';':
            V.addElement(Value);
            Value = null;
            f1 = true; f2 = false;
        break;
        default :
            if (f1 == true){
              var += symbol;  
            }   
            else if (f2 == true){
              val += symbol;   
            }              
        break;                
        }        
        i++;                                  
    }
    V.addElement(Var); // и в конце припаиваем имена переменных

    return V;
}


Это сообщение отредактировал(а) OlegRu - 7.12.2005, 18:14
PM MAIL   Вверх
igon
Дата 8.12.2005, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



И как ты потом из V определяешь, что, скажем, 8 - это второй параметр для переменной Var2?

Вот более компактный вариант
Код

public static Vector split(String S)
  {       
    char symbol; // каждый символ строки S
    String item=""; // здесь формируется очередная лексема
    Vector oneSet=new Vector(); // один набор "имя-данные", в oneSet[0]-имя, в остальных элементах - данные
    Vector V=new Vector(); // результат парсинга строки

    int i=0;
    while (i < S.length())
      {   
        symbol=S.charAt(i);
if (symbol=='='||symbol==',')
  {
    oneSet.addElement(item);
    item = "";                         
  }
else if (symbol==';')
  {
    V.addElement(oneSet);
    oneSet=new Vector();
  }
else
  {
    item += symbol;   
  }
/*        switch ( symbol )
          {
            case '=':
              oneSet.addElement(item);
              item = "";                         
              break;
            case ',':
              oneSet.addElement(item);
              item = "";
              break;
            case ';':
              V.addElement(oneSet);
              oneSet=new Vector();
              break;
            default :
              item += symbol;   
              break;                
          }        
*/
        i++;                                  
    }
/*
for (i=0;i<V.size();i++)
  {
    Vector currentSet = (Vector)V.elementAt(i);
    System.out.println("Переменная: "+currentSet.elementAt(0));
    for (int j=1;j<currentSet.size();j++)
      {
        System.out.println("Значение: "+currentSet.elementAt(j));
      }
  }
((Vector)V.elementAt(1)).addElement("Добавлен");
for (i=0;i<V.size();i++)
  {
    Vector currentSet = (Vector)V.elementAt(i);
    System.out.println("Переменная: "+currentSet.elementAt(0));
    for (int j=1;j<currentSet.size();j++)
      {
        System.out.println("Значение: "+currentSet.elementAt(j));
      }
  }
*/
    return V;
}



--------------------
Хотите поговорить об этом?
PM   Вверх
Sardar
Дата 9.12.2005, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Вкуриваем это: http://www.softcraft.ru/translat/lect/t04-03.shtml
а ещё лучше весь курс. Направленый граф/автомат лучше сделать на таблице, где по горизонтали приходят классы символов, а по вертикали текущее состояние. Маленькой табличкой всё порешаешь. Сохранять инфу лучше не в нескольких векторах, а в одном, держа пары ключ=>[значения] в обьектах. Функционально делать будет то же самое, просто код станет короче, логически более верный.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
OlegRu
Дата 16.12.2005, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



To igon
<< И как ты потом из V определяешь, что, скажем, 8 - это второй параметр для переменной Var2?
Да, согласен с тобой полностью. Можно, но не удобно.
И код твоего примера намного проще (без лишних логических переменных).
Я оставил как у тебя, только переписал под case-структуру.

Теперь если подать на вход строку: "var1=12,56,3,0,11;var2=4,9,2;var3=text;",
то получим:
V=[ [ var1 , 12 , 56 , 3 , 0 , 11 ] [ var2 , 4 , 9 , 2 ] [ var3 , text ] ]

Vector V1=null;
V1=(Vector)V.elementAt(0);
// Так получаем имя переменной var1:
System.out.println(V1.elementAt(0));
// А например так получаем 2-й элемент переменной var1:
System.out.println(V1.elementAt(2));

Лично мне так удобно работать.
Возник еще такой вопрос: в PHP это так: $str="var1"; $$str; - т.е. применяем "переменную переменной", чтобы объявить любую строку как переменную.
Как это же сделать в Java???
Т.е. мне надо, чтобы V1=(Vector)V.elementAt(0); [ var1 , 12 , 56 , 3 , 0 , 11 ]
легко преобразовалось в int[] var1 = new int[5];

To Sardar
Спасибо за ссылку, этот сайт мне пригодится - уверен!
Тема интересная, но пока нет времени вкуривать smile
Хотя раньше занимался автоматами Мили и Мура, диаграммы Вейча-Карно и т.д. smile
PM MAIL   Вверх
Dancer
Дата 16.12.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что-то вроде такого можно. Хотя кажется через ArrayList можно, но например в J2ME его нету, поэтому придётс так smile. (Зато будет так везде работать)

Код


public int [] convertStringToIntFromMyVector(Vector vec) {
    int [] mas = new int[vec.size()];
    for(int i=1; i < mas.length; i++) {
        try {
            mas[i-1] = Integer.parseInt(vec.elementAt(i), 10);
        } catch(Exception e) {
            System.out.println("During parse element ["+i+"] from vector ERROR was cathced. \nmas["+(i-1)+"] set to 0");
            mas[i-1] = 0;
        }
        return mas;
    }



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


Новичок



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

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



To Dancer
Спасибо, это я знаю. Там похоже только еще надо приведение типов сделать:
Integer.parseInt((String)vec.elementAt(i), 10)
Хотя я делаю так: Integer.valueOf( (String)vec.elementAt(i) ).intValue().
Интересно, какой код быстрее работает? smile

Но мой вопрос был в другом smile
Пусть есть String str="var_str";
Как создать автоматически переменную String var_str=""; ???
В РНР это называется "переменная переменной":
$str="var_str";
$$str; <- тут мы создаем переменную $var_str.
Или так нельзя в Java??

Это сообщение отредактировал(а) OlegRu - 16.12.2005, 16:00
PM MAIL   Вверх
batigoal
Дата 16.12.2005, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Тьфу, блин, топики перепутал smile
Пятница...

Это сообщение отредактировал(а) Lamer George - 16.12.2005, 16:58


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
igon
Дата 17.12.2005, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Возможно, поможет
http://forum.vingrad.ru/index.php?showtopic=73147



--------------------
Хотите поговорить об этом?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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