也许有一种方法可以做到这一点,我不知道 - 我怀疑它 - 但我正在尝试将一个字符串数组转换为一个对象数组。这是问题:我正在从命令行读取文件。该文件表示以下类型的几个类,每个类都有自己的数据字段。车辆是所有人的父母类:车辆,汽车,美国汽车,外国汽车,卡车,自行车。
将文件读入字符串数组没有问题。但是,我需要创建所有这些类型的对象,并将它们存储在Vehicle []类型的数组中。例如,文件的一部分如下所示:
其中类型类型是后面的第一行,所有者的姓名,地址,电话号码,电子邮件地址......每种类型都有特定的字段。所以外国汽车不是在底特律生产的。每个字段都显示在文件的单独行中。所以我所做的就是将整个文件读入字符串数组。但是,我需要在字符串数组中找到我的类型,创建这些类型的对象,并将它们存储在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 :(得分: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中使用typeidentifiers。例如: 汽车:americancar 地址:12345 bla etcetc
或使用序列化程序
答案 2 :(得分:0)
您可以像刚才那样读取文件,但是当您读取类型的字符串时,请创建正确的Vehicle类型的实例。看来您会知道该文件的下一行是该特定类型的属性,因此您将读取属性并在Vehicle实例上设置它们。然后,将Vehicle实例添加到Vehicle阵列。
答案 3 :(得分:0)
我会使用创建适配器的Factory模式。工厂将采用字符串(Vehicle,American Car),适配器将采用字符串数组和当前索引。适配器负责知道要读取多少索引并返回具体对象(或接口)。
IAdapter adapter = AdapterFactory.Create( "American Car" );
Object concreteObject = adapter.Popluate( stringArray, currentIndex );
现在,如果您可以控制数据的存储方式,您可能需要查看标准序列化,甚至是JSON,以便于处理。
答案 4 :(得分: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();
}
}
答案 5 :(得分:0)
您是否可以控制传入的文件?如果是这样,我可以建议使用XML格式化它,然后使用JDOM解析它吗?在解析方面,它会让您的生活更轻松。例如,您可以格式化所有车辆条目:
<node type="vehicle>
<attributes location="detroit" color="red" />
</node>
或者你提出的任何格式。这样做的好处是,您可以只读取车辆(或任何您想要的),或使用XPath或其他技术有效地获取您想要/需要的信息并将其加载到正确的数据类型。
如果您无法控制文件格式,请忽略此建议。
答案 6 :(得分:0)
如果您有选择,请更改文件格式。
您可以使用xstream序列化对象。然后,您只需存储完整的Java对象,而无需检查是否存在某个值。
答案 7 :(得分:0)
我在这里使用Builder模式而不是Factory。没有太大的区别,但是当参数变化时,发现它会更容易,就像在他的例子中那样。