Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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++;
}

Другие советы

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

псевдо:

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 bla и так далее

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

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

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

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

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

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

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

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

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

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

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();
   }
}

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



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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top