2009-03-02 116 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。沒有什麼太大的區別,但是當參數變化的時候會發現它更容易一些,就像在他的例子中看起來那樣。