也许有一种我不知道的方法可以做到这一点 - 虽然我对此表示怀疑 - 但我正在尝试将字符串数组转换为对象数组。问题是这样的:我正在从命令行读取文件。该文件代表以下类型的多个类,每个类都有自己的数据字段。Vehicle 是所有以下对象的父类:车辆、轿车、美国车、外国车、卡车、自行车。

我将文件读入字符串数组没有问题。但是,我需要创建所有这些类型的对象并将它们存储在 Vehicle[] 类型的数组中。例如,文件的一部分如下所示:

  • 车辆
  • 金·斯坦利·罗宾逊
  • 2344法院驱动器
  • (221)885-7777
  • stackoverflow@overflow.com
  • 美国汽车
  • 约翰·班扬
  • 1010 二进制车道
  • (221)885-55643
  • bgt.com
  • 可转换的
  • 底特律制造
  • 联合工厂

其中类类型是第一行,后面跟着所有者姓名、地址、电话号码、电子邮件地址...每种类型都有特定的字段。所以外国汽车不是底特律制造的。每个字段都显示在文件中的单独行上。所以我所做的是将整个文件读入字符串数组。但是,我需要在字符串数组中找到我的类型,创建这些类型的对象,并将它们存储在 Vehicle 数组中。我的主要问题是每个数据字段都位于单独的行上。我应该如何解决这个问题?顺便说一下,这是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 etcetc

或者使用序列化器

您可以像刚才一样读取该文件,但是当您读取类类型的字符串时,会创建正确车辆类型的实例。您似乎会知道该文件的接下来的 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 对其进行格式化,然后使用 JDOM?它会让你的解析生活变得更轻松。例如,您可以将所有车辆条目设置为如下格式:



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

或者您想出的任何格式。这样做的好处是您可以只读入车辆(或您想要的任何内容),或者使用 XPath 或其他一些技术来有效地获取您想要/需要的信息并将其加载到正确的数据类型。

如果您无法控制文件格式,请忽略此建议。

当您可以选择时,请更改文件格式。

您可以使用以下方法序列化您的对象 流媒体. 。然后,您只需存储完整的 Java 对象,而无需检查某个值是否存在。

我会用 建设者 这里的模式而不是工厂。没有什么大的区别,但是当参数变化时,就像他的示例中那样,会发现它更容易一些。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top