0

我真的很难解析文本文件。我有一个文本文件,格式如下

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);
        }
4

3 回答 3

0

您可以在此处尝试使用 ANTLR,语法定义了您期望的文本格式,然后您可以将内容包装在 Java 对象中。* 和 + 通配符将解决 while 和 for 的复杂性。它非常简单易用,您不必构造 AST,您可以直接从 java 对象中获取解析后的内容。但唯一的开销是您必须将 ANTLR.jar 添加到您的路径中。

于 2013-05-21T12:12:12.270 回答
0

我假设“字段”表示一个 ID 和可变数量的坐标(浮点数对),从您的代码来看,它实际上代表一个多边形。

我首先将所有多边形加载到一个单独的Polygon对象中:

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

并将多边形存储在另一个列表中。然后在第二遍中遍历所有多边形,根据它们的 ID 将它们分组为类似

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

我认为这将是相当简单的编码。

OTOH,如果您在文件中有大量数据,并且/或者您更喜欢一点一点地处理读取的数据,您可以简单地读取一个多边形及其所有相关的切口,直到找到下一个多边形(ID 为 0),此时您可以简单地将到目前为止读取的内容传递给构建数据库并开始读取下一个多边形。

于 2010-02-11T21:05:46.220 回答
0

也许您应该将地图用于新的花车和相关的花车..如果有您的问题,它应该会有所帮助..例如:

HashMap hm = new HashMap();
hm.put("Rohit", new Double(3434.34));
于 2010-02-11T21:06:30.833 回答