我真的很难解析一个文本文件。我有一个文本文件,它的格式如下
ID
Float Float
Float Float
.... // variable number of floats
END
ID
Float Float
Float Float
....
END然而,ID可以表示两个值中的一个,0表示它是新字段,或者-1表示它与上一个新字段相关。相关字段自身可以重复的次数是无限制的。这就是问题所在。
因为我在库中有一个方法,它接受新浮点数的ArrayList,然后是相关浮点数的ArrayList的ArrayList。
当我尝试编写代码的逻辑时,我只是不断地嵌入越来越深的while循环。
我真的很感谢任何关于我应该如何去做的建议。提前谢谢。
这是我到目前为止拥有的代码。
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);
}发布于 2010-02-12 05:05:46
我假设"field“意味着一个ID和一个可变数量的坐标(浮点数对),从您的代码判断,它实际上表示一个多边形。
我将首先加载所有多边形,每个多边形都加载到一个单独的Polygon对象中:
class Polygon {
boolean isNew;
List<Coordinate> coordinates;
}并将多边形存储在另一个列表中。然后在第二遍中遍历所有的多边形,根据它们的ID将它们分组为类似于
class Building {
Polygon polygon;
List<Polygon> cutouts;
}我认为这将是相当简单的编码。
如果你在文件中有大量的数据,和/或你喜欢一点一点地处理读取的数据,你可以简单地读取一个多边形及其所有相关的裁剪,直到你找到下一个多边形(ID为0),在这一点上,你可以简单地将到目前为止读取的内容传递给building DB,并开始读取下一个多边形。
发布于 2010-02-12 05:06:31
也许你应该为新的浮点数和相关的floats..if使用map它应该是help..example:
HashMap hm = new HashMap();
hm.put("Rohit", new Double(3434.34));发布于 2013-05-21 20:12:12
您可以尝试在这里使用ANTLR,语法定义了您期望的文本格式,然后您可以将内容包装在Java对象中。*和+通配符将解决while和for的复杂性。它非常简单和易于使用,你不需要构造AST,你可以直接从java对象中获取解析的内容。但唯一的开销是您必须将ANTLR.jar添加到您的路径中。
https://stackoverflow.com/questions/2247667
复制相似问题