2009-03-02 108 views
1

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

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

  • 美国车
  • Joh ÑBunyon
  • 1010二进制车道
  • (221)885-55643
  • bgt.com
  • 可转换
  • 在底特律制成
  • 工会植物

在哪里类型是第一所有者的姓名,地址,电话号码,电子邮件地址......每种类型都有其特定的字段。所以一辆外国车不是在底特律制造的。每个字段都显示在文件的单独一行中。所以我所做的是将整个文件读入一个字符串数组。但是,我需要在字符串数组中找到我的类型,创建这些类型的对象,并将它们存储在Vehicle数组中。我的主要问题是每个数据字段都在一个单独的行上。我应该如何处理这个问题? 这是java代码的方式。

+0

不知道我在这里看到问题,为什么单独的行会造成问题? – 2009-03-02 13:32:12

回答

2

最初读数据到一个字符串数组很好。然后,你需要遍历该数组,并根据每个循环(“车辆”,“美国汽车”等)的“第一行”,你会知道该数组的后续元素有多少属于同一个。

像这样的东西(我将让你在自己的空白填写):

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

提示:在textfile.for实例的使用typeidentifiers: 车:americancar 地址:12345 BLA etcetc

或者使用串行

0

你可以读取该文件,你现在所做的只是但当你读一个字符串,它是一个类类型创建一个正确的车辆类型的实例。这样看来你会知道文件的下一个x行是该特定类型的属性,所以你可以读取属性并将它们设置在你的Vehicle实例上。然后,您可以将您的Vehicle实例添加到Vehicle数组中。

+0

谢谢,让我过驼峰。现在我看到非常感谢:) – BloodParrot 2009-03-02 16:52:52

0

我会使用创建适配器的工厂模式。工厂将采取字符串(Vehicle,American Car),并且适配器将采用字符串数组和当前索引。适配器将负责知道要读取和返回具体对象(或接口)的索引数量。

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

现在,如果你有过的数据是如何存储的控制,你可能要考虑标准系列化,甚至JSON,使处理更容易。

+0

对不起Pascal外壳.. C#习惯。 – 2009-03-02 13:56:55

0

在我看来,你需要一个factory pattern从输入建立你的车辆类型。工厂可以在确定一个汽车规格开始和另一个汽车规格结束之后进行查看。然后它将确定一辆汽车的一组领域,并确定汽车类型。然后它可以调用相应的构造函数,传入所有相关的字段。

这意味着(比如说)一辆美国汽车的构造函数指定了它感兴趣的所有字段。欧洲汽车构造者也会这样做。每个构造函数都可以声明它给出的内容,因此不会错误地创建任何汽车。

工厂将负责解析和分离输入,并确定要构建的内容。每种类型的车辆的构造者都会关注的信息,该车辆只有,并执行适当的断言。

工厂将保留创建的汽车列表,并在完成后返回该列表(美国/欧洲/日本)。

在伪代码:

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 2009-03-02 16:54:22

0

你有在传递的文件的控制权?如果是这样,我可以建议使用XML格式化,然后使用JDOM解析它?这将使你的生活在解析方面更容易。例如,您可以像这样格式化所有车辆条目:



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

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

如果您无法控制文件格式,请不要使用此建议。

0

如果您有选择,请更改文件格式。

您可以使用xstream序列化您的对象。然后,您只需存储完整的Java对象而不检查是否存在某个值。

0

我会在这里使用Builder模式而不是Factory。没有什么太大的区别,但是当参数变化的时候会发现它更容易一些,就像在他的例子中看起来那样。