2010-02-11 60 views
0

我真的在解析一個文本文件掙扎。我有一個文本文件,它是在下列格式Java緩衝讀取器文本文件解析

ID 
Float Float 
Float Float 
.... // variable number of floats 
END 
ID 
Float Float 
Float Float 
.... 
END 

等然而,ID可以表示兩個值之一,0,這意味着它是一個新的領域,或-1,這意味着它是與上一個新領域。相關領域可以自我重複的次數是無限的。這是問題發生的地方。

因爲我在一個庫中有一個方法,它需要一個新的Floats的ArrayList,然後是一個ArrayList的ArrayList的相關的浮點數。

當我嘗試爲此編寫邏輯代碼時,我只是在循環中不斷深入嵌入。

我真的很感激任何關於我應該如何去做的建議。提前致謝。

這是我到目前爲止的代碼。

BufferedReader br = new BufferedReader(new FileReader(buildingsFile)); 

     String[] line = br.readLine().trim().split(" "); 
     boolean original = true; 

     while(true) 
     { 
      if(line[0].equals("END")) 
       break; 

      startCoordinate = new Coordinate(Double.parseDouble(line[0]), Double.parseDouble(line[1])); 

      while(true) 
      { 
       line = br.readLine().trim().split(" "); 

       if(!line[0].equals("END") && original == true) 
        polypoints.add(new Coordinate(Double.parseDouble(line[0]), Double.parseDouble(line[1]))); 
       else if(!line[0].equals("END") && original == false) 
        cutout.add(new Coordinate(Double.parseDouble(line[0]), Double.parseDouble(line[1]))); 
       else if(line[0].equals("END") && original == false) 
       { 
        cutouts.add(cutout); 
        cutout.clear(); 
       } 
       else if(line[0].equals("-99999")) 
        original = false; 
       else if(line[0].equals("0")) 
        break; 
      } 

      buildingDB.addBuilding(mapName, startCoord, polypoints, cutouts); 
     } 

新代碼

 int i = 0; 

     BufferedReader br = new BufferedReader(new FileReader(buildingsFile)); 

     String[] line; 

     while(true) 
     { 
      line = br.readLine().trim().split(" "); 

      if(line[0].equals("END")) 
       break; 

      polygons.add(new Polygon(line)); 

      while(true) 
      { 
       line = br.readLine().trim().split(" "); 

       if(line[0].equals("END")) 
        break; 
       polygons.get(i).addCoord(new Coordinate(Double.parseDouble(line[0]), Double.parseDouble(line[1]))); 
      } 



      i++; 
     } 
     System.out.println(polygons.size()); 


     int j = 0; 
     for(i = 0; i< polygons.size(); i++) 
     { 
      Building newBuilding = new Building(); 

      if(polygons.get(i).isNew == true) 
      { 
       newBuilding = new Building(); 
       newBuilding.startCoord = new Coordinate(polygons.get(i).x, polygons.get(i).y); 
      } 

      while(polygons.get(i).isNew == false) 
       newBuilding.cutouts.add(polygons.get(i).coords); 

      buildings.add(newBuilding); 
     } 

     for(i = 0; i<buildings.size(); i++) 
     { 
      System.out.println(i); 
      buildingDB.addBuilding(mapName, buildings.get(i).startCoord, buildings.get(i).polypoint, buildings.get(i).cutouts); 
     } 
+0

你可以發表你目前在做什麼(你的代碼),所以我們可以根據你當前的策略提出建議,而不是覆蓋你已經完成的同一個目標? – 2010-02-11 21:03:31

回答

0

我假定「場」是指一個ID和座標的可變數目(對浮體),即,從代碼判斷,表示實際上的多邊形。

我首先所有多邊形,每個加載到單獨的Polygon對象:

class Polygon { 
    boolean isNew; 
    List<Coordinate> coordinates; 
} 

和多邊形存儲在另一個列表中。然後在第二遍通過所有的多邊形將它們按照他們的ID分組成

class Building { 
    Polygon polygon; 
    List<Polygon> cutouts; 
} 

我認爲這將是相當簡單的代碼。

OTOH如果文件中有大量數據,或者您希望逐漸處理讀取數據,您可以簡單地讀取一個多邊形及其所有關聯的切口,直到找到下一個多邊形(ID爲0),此時您可以簡單地將目前讀取的內容傳遞給建築物數據庫並開始讀取下一個多邊形。

+0

謝謝你生病嘗試你建議的第一種方法,我已經適應了我發佈的一個,但它花了10分鐘纔到達第35棟建築,似乎已經停在那裏。 – John 2010-02-11 22:01:53

+0

我已經實現了這一點,但是Java現在報告說我已經用完了堆,這是非常不尋常的任何想法? – John 2010-02-11 22:54:01

+0

@ John - 嗯。您嘗試閱讀的文件有多大?約。它有多少個多邊形?你能發佈你的更新代碼嗎? – 2010-02-12 08:55:54

0

也許你應該使用的地圖新的花車和相關floats..if得到了你的問題應該help..example:

HashMap hm = new HashMap(); 
hm.put("Rohit", new Double(3434.34)); 
+0

你會使用地圖中的浮動.. :) – shake 2010-02-11 21:07:10

0

您可以嘗試使用此ANTLR,語法定義文本的格式你正在等待,然後你可以將內容包裝在一個Java對象中。 *和+通配符將解決while和for的複雜性。它非常簡單易用,你不需要構造AST就可以直接從java對象中獲取解析的內容。但唯一的開銷是你必須添加ANTLR.jar到你的路徑。