Массив строк в массив объектов - PullRequest
1 голос
/ 02 марта 2009

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

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

  • Автомобиль
  • Ким Стэнли Робинсон
  • 2344 корт
  • (221) 885-7777
  • stackoverflow@overflow.com
  • Американский автомобиль
  • Джон Буньон
  • 1010 бинарный переулок
  • (221) 885-55643
  • bgt.com
  • конвертируемая
  • сделано в Детройте
  • объединение растений

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

Ответы [ 8 ]

2 голосов
/ 02 марта 2009

Первоначально чтение данных в массив 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 голос
/ 02 марта 2009

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

Псевдо:

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.
}

Советы: используйте идентификаторы типов в текстовом файле. Например: Автомобиль: americancar адрес: 12345 бла etcetc

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

0 голосов
/ 02 марта 2009

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

0 голосов
/ 02 марта 2009

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

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

0 голосов
/ 02 марта 2009

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



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

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

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

0 голосов
/ 02 марта 2009

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

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

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

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

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

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 голосов
/ 02 марта 2009

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

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

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

0 голосов
/ 02 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...