Разбор текстового файла с помощью буферизированного Java-ридера - PullRequest
0 голосов
/ 11 февраля 2010

Я действительно борюсь с анализом текстового файла. У меня есть текстовый файл в следующем формате

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

и т. Д. Однако идентификатор может представлять одно из двух значений: 0 означает, что это новое поле или -1 означает, что оно связано с последним новым полем. Количество раз, которое связанное поле может повторить само, неограниченно. Именно здесь возникает проблема.

Так как у меня есть метод в библиотеке, который берет ArrayList новых Float, то ArrayList ArrayList связанных float.

Когда я пытаюсь кодировать логику для этого, я просто продолжаю все глубже и глубже встраивать циклы 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);
        }

Ответы [ 3 ]

0 голосов
/ 12 февраля 2010

Может быть, вам следует использовать карту для новых и связанных поплавков. Если у вас есть вопрос, это должно помочь. Пример:

HashMap hm = new HashMap();
hm.put("Rohit", new Double(3434.34));
0 голосов
/ 21 мая 2013

Вы можете попробовать использовать ANTLR здесь. Грамматика определяет формат ожидаемого текста, а затем вы можете заключить содержимое в объект Java. Символы * и + разрешают сложность while и for. Он очень прост и удобен в использовании, вам не нужно создавать AST, вы можете взять проанализированный контент непосредственно из объектов Java. Но единственные накладные расходы - вы должны добавить ANTLR.jar к своему пути.

0 голосов
/ 12 февраля 2010

Я предполагаю, что «поле» означает идентификатор и переменное число координат (пары с плавающей точкой), которые, судя по вашему коду, фактически представляют многоугольник.

Сначала я бы загрузил все полигоны, каждый в отдельный Polygon объект:

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

и сохранить полигоны в другом списке. Затем во втором проходе пройдитесь по всем полигонам, чтобы сгруппировать их по их идентификаторам во что-то вроде

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

Я думаю, это было бы довольно просто для кода.

OTOH, если у вас есть огромный объем данных в файле, и / или вы предпочитаете обрабатывать прочитанные данные понемногу, вы можете просто прочитать многоугольник и все связанные с ним вырезы, пока не найдете следующий многоугольник (идентификатор 0), после чего вы можете просто передать прочитанный материал в базу данных здания и начать читать следующий многоугольник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...