2015-05-24 62 views
0

我正在爲Android編寫一個應用程序,我允許用戶創建他們的車輛,我將這些車輛以結構化格式存儲到配置文件中。例如:在運行時從Java中的配置文件創建對象

[VEHICLE1] 
VEHICLE1>type>car 
VEHICLE1>fuelUsageMPG>30 
VEHICLE1>speed>100 
[ENDVEHICLE1] 
[VEHICLE2] 
VEHICLE2>type>car 
VEHICLE2>fuelUsage>35 
VEHICLE2>speed>85 
[ENDVEHICLE2] 

我的應用程序有一個名爲「vehicle」的類具有相同的固定數量的屬性。所以我想要做的是在運行時創建這些對象,並根據配置文件設置對象屬性,以便我可以在程序中進一步使用以執行計算。

我使用標誌和引用組解析該配置文件,並遍歷遍數次,因爲我找到模式「[VEHICLE。]」,但無法弄清楚如何使用VEHICLE1,VEHICLE2或任何其他方法創建車輛實例其他自動增量對象引用。

任何示例代碼或指導將不勝感激。

+2

你應該發佈你的解析代碼。因爲它是很難幫助你 –

回答

1

我也完全AndriiElDuderino同意,但如果你不能改變你的輸入格式。你可以試試下面的代碼:

有一種方法說getVehicleList象下面這樣:

public ArrayList<Vehicle> getVehicleList(File fin) { 
    ArrayList<Vehicle> vehicleList = new ArrayList<Vehicle>(); 

    // Taken for my convenience, you should read it from "File fin" 
    InputStream ins = getResources().openRawResource(
      getResources().getIdentifier("raw/vehicle", "raw", getPackageName())); 
    try { 
     BufferedReader br = new BufferedReader(new InputStreamReader(ins)); 
     String line = null; 

     int cursor = 0; 
     while ((line = br.readLine()) != null) { 
      if (line.contains("[VEHICLE")) { 
       Vehicle v = new Vehicle(); 
       vehicleList.add(cursor, v); 
      } else if (line.contains("[ENDVEHICLE")) { 
       cursor++; 
      } else { 
       // read vehicle attributes here 
       Vehicle v1 = vehicleList.get(cursor); 
       String[] attr = line.split(">"); 
       if (attr != null && attr.length == 3) { 
        if (attr[1].contains("type")) { 
         v1.type = attr[2]; 
        } else if (attr[1].contains("fuelUsage")) { 
         v1.fuelUsageMPG = attr[2]; 
        } else if (attr[1].contains("speed")) { 
         v1.speed = attr[2]; 
        } 
       } 
      } 
     } 
     return vehicleList; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

請會有很多邊緣情況,但這個想法是你必須創建ArrayList,直到你讀同一Vehicle保持cursor相同和讀取相同的Vehiclecursor你的ArrayList的位置。

+0

感謝將它打包成一個全面的代碼,這有助於大量了解Java邏輯和方法以獲得我需要去的地方! – Gaetano

+0

一旦我有一個工作的應用程序,我可能會走下XML路徑,我想清理編碼,但現在,文本文件是一個更簡單的結構,以編程方式創建。 – Gaetano

+0

請嘗試以上方法,如果它滿足您的期望,您可以接受它。很高興,如果它可以幫助你:) – Mithun

1

起初,您可以簡化您的配置文件是這樣的:

[VEHICLE1] 
    type>car 
    fuelUsageMPG>30 
    speed>100 
[ENDVEHICLE1] 
[VEHICLE2] 
    type>car 
    fuelUsage>35 
    speed>85 
[ENDVEHICLE2]` 

(但我認爲使用JSON或XML會更容易,因爲你將不必使用自己的解析器)

然後你可以從這個文件車輛讀取車輛,併爲他們每個人調用你的車輛的構造函數。

喜歡的東西: new Vehicle(type, fuelUsage, speed)

編輯:

您可以將它們存儲這樣的:

ArrayList al = new ArrayList(); 

..... loop start 
al.add(new Vehicle(type, fuelUsage, speed)); 
..... loop end 

//get the VEHICLE1 
al.get(0); 
//get the VEHICLE5 
al.get(4); 
+0

我會更加強調「使用XML或JSON」部分... – ElDuderino

+0

@ElDuderino是的,我認爲這將是最好的選擇 –

+0

在你提出的方法中,我將如何參考每個車輛實例?我可以重複使用建議的代碼,而不需要像'Vehicle vehicle1 = new Vehicle()'這樣的經典結構提供一些唯一的標識符嗎?如果是這樣,在構建它們之後我將如何引用每個實例? – Gaetano