Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Вопрос про структуру вектора (Vector)


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

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

Код

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.

Автор: Sardar 7.12.2005, 17:25
Да можно, т.к. Vector это обьект и сам хранит обьекты.

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

Автор: OlegRu 7.12.2005, 18:12
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;
}

Автор: igon 8.12.2005, 23:45
И как ты потом из 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;
}

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

Автор: OlegRu 16.12.2005, 11:17
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

Автор: Dancer 16.12.2005, 13:40
Что-то вроде такого можно. Хотя кажется через 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;
    }

Автор: OlegRu 16.12.2005, 15:57
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??

Автор: batigoal 16.12.2005, 16:56
Тьфу, блин, топики перепутал smile
Пятница...

Автор: igon 17.12.2005, 00:37
Возможно, поможет
http://forum.vingrad.ru/index.php?showtopic=73147

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