首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Buffered Reader文本文件解析

Java Buffered Reader文本文件解析
EN

Stack Overflow用户
提问于 2010-02-12 04:59:15
回答 3查看 5.4K关注 0票数 0

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

代码语言:javascript
复制
ID
Float Float 
Float Float
....   // variable number of floats
END
ID
Float Float 
Float Float
....   
END

然而,ID可以表示两个值中的一个,0表示它是新字段,或者-1表示它与上一个新字段相关。相关字段自身可以重复的次数是无限制的。这就是问题所在。

因为我在库中有一个方法,它接受新浮点数的ArrayList,然后是相关浮点数的ArrayList的ArrayList。

当我尝试编写代码的逻辑时,我只是不断地嵌入越来越深的while循环。

我真的很感谢任何关于我应该如何去做的建议。提前谢谢。

这是我到目前为止拥有的代码。

代码语言:javascript
复制
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);
        }

新代码

代码语言:javascript
复制
        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);
        }
EN

回答 3

Stack Overflow用户

发布于 2010-02-12 05:05:46

我假设"field“意味着一个ID和一个可变数量的坐标(浮点数对),从您的代码判断,它实际上表示一个多边形。

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

代码语言:javascript
复制
class Polygon {
    boolean isNew;
    List<Coordinate> coordinates;
}

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

代码语言:javascript
复制
class Building {
    Polygon polygon;
    List<Polygon> cutouts;
}

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

如果你在文件中有大量的数据,和/或你喜欢一点一点地处理读取的数据,你可以简单地读取一个多边形及其所有相关的裁剪,直到你找到下一个多边形(ID为0),在这一点上,你可以简单地将到目前为止读取的内容传递给building DB,并开始读取下一个多边形。

票数 0
EN

Stack Overflow用户

发布于 2010-02-12 05:06:31

也许你应该为新的浮点数和相关的floats..if使用map它应该是help..example:

代码语言:javascript
复制
HashMap hm = new HashMap();
hm.put("Rohit", new Double(3434.34));
票数 0
EN

Stack Overflow用户

发布于 2013-05-21 20:12:12

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2247667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档