2015-05-24 4 views
0

Я пишу приложение для Android, где я разрешаю пользователям создавать свои транспортные средства, которые я храню в конфигурационном файле в структурированном формате. Что-то вроде:создание объектов во время выполнения из файла конфигурации в Java

[VEHICLE1] 
VEHICLE1>type>car 
VEHICLE1>fuelUsageMPG>30 
VEHICLE1>speed>100 
[ENDVEHICLE1] 
[VEHICLE2] 
VEHICLE2>type>car 
VEHICLE2>fuelUsage>35 
VEHICLE2>speed>85 
[ENDVEHICLE2] 

Мое приложение имеет класс под названием «транспортное средство» с таким же фиксированным количеством атрибутов. Поэтому я пытаюсь создать эти объекты во время выполнения и установить свойства объекта на основе файла конфигурации, чтобы затем я мог использовать далее в программе для выполнения вычислений.

Я анализирую этот файл конфигурации с использованием флагов и ссылочных групп и прокручиваю столько раз, сколько я нахожу шаблон «[АВТОМОБИЛЬ.]», Но не могу понять, как создать экземпляр транспортных средств() с помощью VEHICLE1, VEHICLE2 или любого другого другая автоматическая инкрементная ссылка на объект.

Любой образец кода или руководство было бы высоко оценено.

+2

Вы должны опубликовать свой синтаксический код. Как трудно вам помочь –

ответ

1

Я также полностью согласен с Andrii и ElDuderino, но в случае, если вы не можете изменить формат ввода , Вы можете попробовать ниже кода:

Есть способ сказать getVehicleList, как показано ниже:

public ArrayList<Vehicle> getVehicleList(File fin) { 
    ArrayList<Vehicle> vehicleList = new ArrayList<Vehicle>(); 

    // Taken for my convenience, you should read it from "File fin" 
    InputStream ins = getResources().openRawResource(
      getResources().getIdentifier("raw/vehicle", "raw", getPackageName())); 
    try { 
     BufferedReader br = new BufferedReader(new InputStreamReader(ins)); 
     String line = null; 

     int cursor = 0; 
     while ((line = br.readLine()) != null) { 
      if (line.contains("[VEHICLE")) { 
       Vehicle v = new Vehicle(); 
       vehicleList.add(cursor, v); 
      } else if (line.contains("[ENDVEHICLE")) { 
       cursor++; 
      } else { 
       // read vehicle attributes here 
       Vehicle v1 = vehicleList.get(cursor); 
       String[] attr = line.split(">"); 
       if (attr != null && attr.length == 3) { 
        if (attr[1].contains("type")) { 
         v1.type = attr[2]; 
        } else if (attr[1].contains("fuelUsage")) { 
         v1.fuelUsageMPG = attr[2]; 
        } else if (attr[1].contains("speed")) { 
         v1.speed = attr[2]; 
        } 
       } 
      } 
     } 
     return vehicleList; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

Пожалуйста, был бы много случаев краев, но идея состоит в том, вы должны создать ArrayList и пока вы не читаете то же Vehicle пропитания cursor то же самое и читать получать то же самое Vehicle от cursor позиция вашего ArrayList.

+0

Спасибо, что упаковали это в полный код, это помогает многому узнать о логике и методах Java, чтобы добраться туда, куда мне нужно идти! – Gaetano

+0

Я могу спуститься по пути XML, когда у меня есть рабочее приложение, и я хочу очистить кодировку, но на данный момент текстовый файл представляет собой более простую структуру для программной разработки. – Gaetano

+0

Пожалуйста, попробуйте с подходом выше, и если он соответствует вашим ожиданиям, вы можете принять его. Рад, если это поможет вам :) – Mithun

1

В первый, вы можете упростить ваш конфигурационный файл, как это:

[VEHICLE1] 
    type>car 
    fuelUsageMPG>30 
    speed>100 
[ENDVEHICLE1] 
[VEHICLE2] 
    type>car 
    fuelUsage>35 
    speed>85 
[ENDVEHICLE2]` 

(но я думаю, что с помощью JSON или XML будет проще, так как вам не придется использовать свой собственный анализатор)

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

Что-то вроде: new Vehicle(type, fuelUsage, speed)

EDIT:

Вы можете хранить их так:

ArrayList al = new ArrayList(); 

..... loop start 
al.add(new Vehicle(type, fuelUsage, speed)); 
..... loop end 

//get the VEHICLE1 
al.get(0); 
//get the VEHICLE5 
al.get(4); 
+0

Я бы поставил больше внимания на «использование XML или json» ... – ElDuderino

+0

@ElDuderino yep, я думаю, что это будет лучший вариант –

+0

В вашем предложенном вами методе, как бы я мог обратитесь к каждому экземпляру транспортного средства? Могу ли я использовать предлагаемый код повторно, не предоставляя уникальный идентификатор, как в классической конструкции типа «Vehicle vehicle1 = new Vehicle()»? и если да, то каким образом я могу ссылаться на каждый экземпляр после их создания? – Gaetano

Смежные вопросы