我正在努力解析文本文件。我有一个文本文件,格式如下
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 :(得分:0)
我假设“字段”表示ID和可变数量的坐标(浮动对),从您的代码判断,实际上表示多边形。
我首先将所有多边形加载到一个单独的Polygon
对象中:
class Polygon {
boolean isNew;
List<Coordinate> coordinates;
}
并将多边形存储在另一个列表中。然后在第二遍中遍历所有多边形,根据他们的ID将它们分组为类似
class Building {
Polygon polygon;
List<Polygon> cutouts;
}
我认为这对代码来说相当简单。
OTOH如果文件中有大量数据,和/或您更喜欢一点一点地处理读取数据,您可以简单地读取多边形及其所有相关切口,直到找到下一个多边形(ID为0),此时你可以简单地将目前读取的东西传递给建筑物DB并开始阅读下一个多边形。
答案 1 :(得分:0)
也许你应该使用map for new floats和相关浮动..如果你的问题应该有帮助......例如:
HashMap hm = new HashMap();
hm.put("Rohit", new Double(3434.34));
答案 2 :(得分:0)
您可以尝试在这里使用ANTLR,语法定义您期望的文本格式,然后您可以将内容包装在Java对象中。 *和+通配符将解决while和for的复杂性。它非常简单易用,你不必构造AST就可以直接从java对象中获取解析后的内容。但唯一的开销是你必须将ANTLR.jar添加到你的路径中。