Генератор переписать XML в Java


Мне дали программу, которая генерирует XML, фильтрует и сортирует элементы. Программа была довольно страшная на цель, т. к. это задание. Оригинальный выход выглядел следующим образом:

<geometricfigures><figure><type>Square</type><area>0,661769</area><xcoordinate>2</xcoordinate><ycoordinate>0</ycoordinate></figure><figure><type>Circle</type><area>2,792598</area><xcoordinate>10</xcoordinate><ycoordinate>9</ycoordinate></figure><figure><type>Triangle</type><area>34,830437</area><xcoordinate>13</xcoordinate><ycoordinate>3</ycoordinate></figure><figure><type>Square</type><area>59,365646</area><xcoordinate>7</xcoordinate><ycoordinate>17</ycoordinate></figure><figure><type>Rectangle</type><area>87,852760</area><xcoordinate>2</xcoordinate><ycoordinate>5</ycoordinate></figure><figure><type>Triangle</type><area>110,448134</area><xcoordinate>11</xcoordinate><ycoordinate>5</ycoordinate></figure><figure><type>Rectangle</type><area>199,078916</area><xcoordinate>18</xcoordinate><ycoordinate>4</ycoordinate></figure><figure><type>Rectangle</type><area>244,638675</area><xcoordinate>10</xcoordinate><ycoordinate>18</ycoordinate></figure><figure><type>Circle</type><area>261,236815</area><xcoordinate>12</xcoordinate><ycoordinate>0</ycoordinate></figure><figure><type>Circle</type><area>309,741691</area><xcoordinate>17</xcoordinate><ycoordinate>12</ycoordinate></figure></geometricfigures>

Я написал "лучшую программу", которая делает то же самое(?) выход в безопасный способами. Вам не нужно видеть исходный код, потому что это не мое. Ниже приведен мой код, чтобы решить задание в изящный способ.

Figure.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "figure")
@XmlAccessorType(XmlAccessType.FIELD)
public class Figure {
    public int getxCoordinate() {
        return xCoordinate;
    }

    public void setxCoordinate(int xCoordinate) {
        this.xCoordinate = xCoordinate;
    }

    public int xCoordinate;

    public int getyCoordinate() {
        return yCoordinate;
    }

    public void setyCoordinate(int yCoordinate) {
        this.yCoordinate = yCoordinate;
    }

    public int yCoordinate;
    public String type;

    public double area;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public double getArea() {
        return calculateArea();
    }
    public double calculateArea() {
        return area;
    }

    public void setArea(double area) {
        this.area = area;
    }



    public int getId() {

        return xCoordinate;
    }

    public void setId(int id) {
        this.xCoordinate = id;
    }
}

Figures.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement(name = "geometricfigures")
@XmlAccessorType(XmlAccessType.FIELD)
public class Figures
{
    @XmlElement(name = "figure")
    private List<Figure> figures = null;

    public List<Figure> getFigures() {
        return figures;
    }

    public void setFigures(List<Figure> figures) {
        this.figures = figures;
    }
}

Прямоугольник, круг, треугольник, Square.java как следующие

public class Rectangle extends Figure implements Shape {

    private double x;

    private double y;

    private int posx;

    private int posy;

    public Rectangle(double x, double y, int posx, int posy) {
        this.x = x;
        this.y = y;
        this.xCoordinate=posx;
        this.yCoordinate=posy;
        this.posx = posx;
        this.posy = posy;
    }

    public double calculateArea() {
            return x * y;
    }
    public void setArea() {
        this.area= x * y;
    }

    public int getXCoordinate() {
        return posx;
    }

    public int getYCoordinate() {
        return posy;
    }
}

Main.java

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class Main {
    static Figures figures = new Figures();

    static {
        figures.setFigures(new ArrayList<Figure>());

        int count = 0;
        // Bygg upp data
        for (int i = 0; i < 10; i++) {
            Random r = new Random();
            double b = r.nextDouble() * 20; // Bredd
            double h = r.nextDouble() * 20; // Höjd
            int posx = r.nextInt(20); // Xposition
            int posy = r.nextInt(20); // YPosition


            if (count == 0) {
                Figure e = new Circle(b / 2, posx, posy);
                e.setType("circle");
                ((Circle) e).setArea();
                figures.getFigures().add(e);
            } else if (count == 1) {
                Figure e = new Rectangle(b, h, posx, posy);
                e.setType("rectangle");
                ((Rectangle) e).setArea();
                figures.getFigures().add(e);
            } else if (count == 2) {
                Figure e = new Square(b, posx, posy);
                e.setType("square");
                ((Square) e).setArea();
                figures.getFigures().add(e);
            } else if (count == 3) {
                Figure e = new Triangle(b, h, posx, posy);
                e.setType("triangle");
                ((Triangle) e).setArea();
                figures.getFigures().add(e);
            }

            if (count == 3) {
                count = 0;
            } else {
                count++;
            }
        }

        //System.out.println("Before" + figures.getFigures());
        // Remove figures which are within 1 unit distance
        Iterator<Figure> itr = figures.getFigures().iterator();
        while (itr.hasNext()) {
            Object o = itr.next();
            for (Object o2 : figures.getFigures()) {
                if (!o.equals(o2) && distance(o, o2) <= 1) {
                    itr.remove();
                    break;
                }
            }
        }

        //System.out.println("After " + figures.getFigures());

        // Sort by area increasing
        Collections.sort(figures.getFigures(), new Comparator<Figure>() {
            public int compare(Figure o1, Figure o2) {
                if (o1.calculateArea() == o2.calculateArea())
                    return 0;
                return o1.calculateArea() < o2.calculateArea() ? -1 : 1;
            }
        });
        //System.out.println("After " + figures.getFigures());

    }

    public static void main(String[] args) throws JAXBException, PersistanceWriteException {
        JAXBContext jaxbContext = JAXBContext.newInstance(Figures.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        //jaxbMarshaller.marshal(figures, System.out);
        jaxbMarshaller.marshal(figures, os);
        try {
            String aString = new String(os.toByteArray(), "UTF-8");
            System.out.println(aString);
        } catch (Exception e) {
            throw new PersistanceWriteException("Error");
        }
        //Marshal the figures list in file
        // jaxbMarshaller.marshal(figures, new File("c:/temp/figures.xml"));
    }



    public static double distance(Object o, Object o2) {
        double x1 = 0.0d;
        double x2 = 0.0d;
        double y1 = 0.0d;
        double y2 = 0.0d;

        if (o instanceof Circle) {
            Circle c = (Circle) o;
            x1 = c.getXCoordinate();
            y1 = c.getYCoordinate();
        } else if (o instanceof Rectangle) {
            Rectangle r = (Rectangle) o;
            x1 = r.getXCoordinate();
            y1 = r.getYCoordinate();
        } else if (o instanceof Square) {
            Square s = (Square) o;
            x1 = s.getXCoordinate();
            y1 = s.getYCoordinate();
        } else if (o instanceof Triangle) {
            Triangle t = (Triangle) o;
            x1 = t.getXCoordinate();
            y1 = t.getYCoordinate();
        }

        if (o2 instanceof Circle) {
            Circle c = (Circle) o2;
            x2 = c.getXCoordinate();
            y2 = c.getYCoordinate();
        } else if (o2 instanceof Rectangle) {
            Rectangle r = (Rectangle) o2;
            x2 = r.getXCoordinate();
            y2 = r.getYCoordinate();
        } else if (o2 instanceof Square) {
            Square s = (Square) o2;
            x2 = s.getXCoordinate();
            y2 = s.getYCoordinate();
        } else if (o2 instanceof Triangle) {
            Triangle t = (Triangle) o2;
            x2 = t.getXCoordinate();
            y2 = t.getYCoordinate();
        }

        double d = distance(x1, y1, x2, y2);
        return d;
    }

    public static double distance(double x1, double y1, double x2, double y2) {
        double x = Math.pow(x1 - x2, 2);
        double y = Math.pow(y1 - y2, 2);
        return Math.sqrt(x + y);
    }
}

Пример вывода

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<geometricfigures>
    <figure>
        <xCoordinate>10</xCoordinate>
        <yCoordinate>3</yCoordinate>
        <type>circle</type>
        <area>13.870408538037795</area>
    </figure>
    <figure>
        <xCoordinate>2</xCoordinate>
        <yCoordinate>4</yCoordinate>
        <type>square</type>
        <area>18.4098066238029</area>
    </figure>
    <figure>
        <xCoordinate>1</xCoordinate>
        <yCoordinate>17</yCoordinate>
        <type>rectangle</type>
        <area>36.95919767574589</area>
    </figure>
    <figure>
        <xCoordinate>18</xCoordinate>
        <yCoordinate>1</yCoordinate>
        <type>square</type>
        <area>42.541412668413486</area>
    </figure>
    <figure>
        <xCoordinate>12</xCoordinate>
        <yCoordinate>11</yCoordinate>
        <type>triangle</type>
        <area>55.28650002737187</area>
    </figure>
    <figure>
        <xCoordinate>0</xCoordinate>
        <yCoordinate>1</yCoordinate>
        <type>circle</type>
        <area>57.192991007832184</area>
    </figure>
    <figure>
        <xCoordinate>15</xCoordinate>
        <yCoordinate>0</yCoordinate>
        <type>rectangle</type>
        <area>109.2909113545273</area>
    </figure>
    <figure>
        <xCoordinate>8</xCoordinate>
        <yCoordinate>18</yCoordinate>
        <type>triangle</type>
        <area>112.23126251037294</area>
    </figure>
    <figure>
        <xCoordinate>13</xCoordinate>
        <yCoordinate>4</yCoordinate>
        <type>circle</type>
        <area>135.37137919412515</area>
    </figure>
    <figure>
        <xCoordinate>15</xCoordinate>
        <yCoordinate>14</yCoordinate>
        <type>rectangle</type>
        <area>237.44416405649417</area>
    </figure>
</geometricfigures>


163
1
задан 19 марта 2018 в 11:03 Источник Поделиться
Комментарии
2 ответа

О своем выборе использования JAXB, JAXB является основой полезного для сериализации и десериализации XML в объекты. Однако, вы должны иметь весь граф объектов в памяти, чтобы генерировать XML и которые могут повлиять на ваши выступления.

Для вашего Rectangle класс. Есть в этих двух методов, calculateArea():double и setArea():void они делают более или менее то же самое, но второй в самом деле странно. Во-первых, потому что, как правило, сеттер ожидает параметр. Во-вторых, потому что вы должны вызвать его на всякого рода форму, чтобы он полностью инициализирован. обычно это работа для конструктора. А вы выставляете области через getArea():double что либо вычислить его при каждом вызове или вернуть стоимость предварительно рассчитывается с помощью вашего конструктора (и каждый раз одно значение изменить)

В distance метод в основной актерский состав все объекты пока ненужно:
((Circle) o).getXCoordinate(); вернет тот же результат, что o.getXCoordinate();.

Вы можете также избежать литья в static блок, если вы объявляете правильный тип переменной. Circle c = new Circle().

Если вы хотите снять фигуры с одинаковой площадью, вы можете использовать Set С компаратор на площади. Он будет только один. Это же относится и к вашей сортировки.

Наконец, в основной способ перехватывать все исключения и повторно созданную без использования оригинала. Делая это, вы потеряете всю трассировку стека. Это не проблема в вашем случае, но может быть, когда у вас есть глубокая структура.

1
ответ дан 21 марта 2018 в 04:03 Источник Поделиться

Вот мои комментарии:

Рисунок класс


  1. Если у вас есть геттер и сеттер методы, переменные экземпляра должны быть объявлены как private.

  2. группировка объявлений переменных (либо в верхней или нижней части класса) способствует читабельности (читатель не должен искать переменной среди всех методов)

Класс прямоугольник


  1. Я не понимаю, почему у вас posx и posy переменных. они, кажется, служат той же цели x/yCoordinate переменные в супер класс.

  2. Ты понимаешь, что RectangleС getXCoordinate() никак не переопределить FigureС getxCoordinate()?

0
ответ дан 21 марта 2018 в 01:03 Источник Поделиться