2009-03-02 5 views
1

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

У меня нет проблем с чтением файла в массив строк. Однако мне нужно создавать объекты всех этих типов и хранить их в массиве типа Vehicle []. Например, часть файла выглядит следующим образом:

  • Автомобиль
  • Ким Стэнли Робинсон
  • 2344 суд привод
  • (221)885-7777
  • [email protected]
  • Американский автомобиль
  • Joh п Bunyon
  • 1010 двоичных перло
  • (221) 885-55643
  • bgt.com
  • конвертируемой
  • сделаны в Детройте
  • объединения завод

где тип класса является первым строка, за которой следует имя владельца, адрес, номер телефона, адрес электронной почты ... У каждого типа есть поля, относящиеся к нему. Так что иностранный автомобиль не производится в Детройте. Каждое из этих полей отображается в отдельной строке файла. Итак, что я сделал, читается весь файл в массив строк. Однако мне нужно найти мои типы в массиве строк, создать объекты этих типов и сохранить их в массиве Vehicle. Моя основная проблема заключается в том, что каждое поле данных находится в отдельной строке. Как мне подойти к этой проблеме? Это, кстати, код Java.

+0

Не уверен, что вижу проблему здесь, почему отдельные строки создают проблему? –

ответ

2

Первоначально чтение данные в массив String прекрасны. Затем вам нужно пройти через этот массив и на основе «первой строки» каждого цикла («Автомобиль», «Американский автомобиль» и т. Д.) Вы узнаете, сколько последующих элементов массива принадлежит одному и тому же.

Что-то вроде этого (я дам вам заполнить пробелы самостоятельно):

int i = 0; 
ArrayList<vehicle> vehicles = new ArrayList(); 
while (i < data.length) 
{ 
    if (data[i].equalsIgnoreCase("vehicle")) 
    { 
    Vehicle vehicle = new Vehicle(); 
    vehicle.setOwner(data[++i]); 
    ... 
    vehicles.add(vehicle); 
    } 
    else if (data[i].equalsIgnoreCase("american car")) 
    { 
    ... 
    } 
    i++; 
} 
1

вопрос не понимает. Вы хотите знать, как разбирать файл и использовать слова в каждой строке, чтобы создать объект?

псевдо:

Vehicle_ptr myVeh = null; 
for each line in file 
switch line 
{ 
case vehicle: myVeh = new Vehicle(); 
case American Car : myVeh = new AmericanCar(); 
default: 
if (line.startswithaninteger && (myVeh != NULL)) myVeh.address = line; 
etcetc. 
} 

Советы: использование typeidentifiers в textfile.for Например: автомобиля: americancar адрес: 12345 бла etcetc

Или использовать сериализатору

0

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

+0

Спасибо, что посадили меня на горб. Теперь я вижу большое спасибо :) – BloodParrot

0

Я бы использовал шаблон Factory, который создает адаптеры. Завод возьмет строку (Vehicle, American Car), и адаптер возьмет строковый массив и текущий индекс. Адаптер должен был бы знать, сколько индексов читать и возвращать конкретный объект (или интерфейс).

IAdapter adapter = AdapterFactory.Create("American Car"); 
Object concreteObject = adapter.Popluate(stringArray, currentIndex); 

Теперь, если у вас есть контроль над тем, как хранятся данные, вы можете посмотреть в стандартную сериализацию, даже JSON, чтобы сделать обработку легче.

+0

Извините корпус Pascal .. C# привычка. –

0

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

Это означает, что конструктор (скажем) американского автомобиля задает все поля, которые его интересуют. Европейский конструктор автомобилей сделает то же самое. Каждый конструктор может утверждать, что он был дан, чтобы вы не создавали какие-либо автомобили неправильно.

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

Завод будет вести список созданных автомобилей и вернуть этот список (из Америки/Европы/Японии) по завершении.

В псевдокоде:

whilst(!done) { 
    fields.add(fieldFromFile); 

    if (carSpecificationCompleted) { 
     type = getType(fields); 
     if (type == 'American') { 
      car = new AmericanCar(fields); 
     } 
     else if (type == 'European') { 
      car = new EuropeanCar(fields); 
     } 
     cars.add(car); 
     clearStoredFields(); 
    } 
} 
+0

спасибо никогда не слышали о методе фабрики раньше! – BloodParrot

0

У вас есть контроль файла, который передается в? Если да, могу ли я предложить форматировать его с помощью XML, а затем разобрать его, используя JDOM? Это облегчит вашу жизнь с точки зрения разбора. Например, вы можете отформатировать все записи в автомобиле следующим образом:



    <node type="vehicle> 
     <attributes location="detroit" color="red" /> 
    </node> 

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

Не обращайте внимания на этот совет, если у вас нет контроля над форматированием файлов.

0

Если у вас есть выбор, измените формат файла.

Вы можете сериализовать свой объект, используя xstream. Затем вам нужно только сохранить полный объект Java, не проверяя, существует ли какое-то значение.

0

Я бы использовал шаблон Builder здесь вместо Factory. Нет большой разницы, но найти это немного легче, когда параметры меняются, как это, кажется, в его примере.

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