Как создать файл Java Graph из файла .txt

#java #graph

#java #График

Вопрос:

Я пытаюсь создать файл графика.Я должен прочитать значения из файла .gra (который, я думаю, является файлом .txt).Нам сказали обозначить строки на основе пробела в формате <vertex> <name> <x-coord> <y-coord> , аналогичном для edge

Я просмотрел пару связанных вопросов, но все еще не могу найти ответ.

Вот код, который мне дали:

         public EdgeListVertex(V element) {
            this.element = element;
        }

        @Override
        public V element() {
            return element;
        }

        public String toString() {
            return element.toString();
        }
    }

    private class EdgeListEdge implements Edge<E> {
        Position<EdgeListEdge> position;
        E element;
        EdgeListVertex start, end;


        public EdgeListEdge(EdgeListVertex start, EdgeListVertex end, E element) {
            this.start = start;
            this.end = end;
            this.element = element;
        }

        @Override
        public E element() {
            return element;
        }

        public String toString() {
            return element.toString();
        }
    }

    private List<EdgeListVertex> vertices;
    private List<EdgeListEdge> edges;


    public EdgeListGraph() {
        vertices = new LinkedList<EdgeListVertex>();
        edges = new LinkedList<EdgeListEdge>();

    }

    @SuppressWarnings("unchecked")
    @Override
    public Vertex<V>[] endVertices(Edge<E> e) {
        EdgeListEdge edge = (EdgeListEdge) e;
        Vertex<V>[] endpoints = (Vertex<V>[]) new Vertex[2];
        endpoints[0] = edge.start;
        endpoints[1] = edge.end;
        return endpoints;
    }

    @Override
    public Vertex<V> opposite(Vertex<V> v, Edge<E> e) {
        Vertex<V>[] endpoints = endVertices(e);
        if (endpoints[0].equals(v)) {
            return endpoints[1];
        } else if (endpoints[1].equals(v)) {
            return endpoints[0];
        }
        throw new InvalidVertexException();
    }

    @Override
    public boolean areAdjacent(Vertex<V> v, Vertex<V> w) {
        for (EdgeListEdge edge: edges) {
            if ((edge.start.equals(v)) amp;amp; (edge.end.equals(w))) return true;
            if ((edge.end.equals(v)) amp;amp; (edge.start.equals(w))) return true;
        }
        return false;
    }

    @Override
    public V replace(Vertex<V> v, V x) {
        EdgeListVertex vertex = (EdgeListVertex) v;
        V temp = vertex.element;
        vertex.element = x;
        return temp;
    }

    @Override
    public E replace(Edge<E> e, E x) {
        EdgeListEdge edge = (EdgeListEdge) e;
        E temp = edge.element;
        edge.element = x;
        return temp;
    }

    @Override
    public Vertex<V> insertVertex(V v) {
        EdgeListVertex vertex = new EdgeListVertex(v);
        Position<EdgeListVertex> position = vertices.insertLast(vertex);
        vertex.position = position;
        return vertex;
    }

    @Override
    public Edge<E> insertEdge(Vertex<V> v, Vertex<V> w, E o) {
        EdgeListEdge edge = new EdgeListEdge((EdgeListVertex) v, (EdgeListVertex) w, o);
        Position<EdgeListEdge> position = edges.insertLast(edge);
        edge.position = position;
        return edge;
    }

    @Override
    public V removeVertex(Vertex<V> v) {
        Iterator<Edge<E>> it = incidentEdges(v).iterator();
        while (it.hasNext()) it.remove();

        EdgeListVertex vertex = (EdgeListVertex) v;
        vertices.remove(vertex.position);
        return vertex.element;
    }

    @Override
    public E removeEdge(Edge<E> e) {
        EdgeListEdge edge = (EdgeListEdge) e;
        edges.remove(edge.position);
        return edge.element;
    }

    @Override
    public List<Edge<E>> incidentEdges(Vertex<V> v) {
        LinkedList<Edge<E>> list = new LinkedList<Edge<E>>();

        for (EdgeListEdge edge : edges) {
            if (edge.start.equals(v)) list.insertLast(edge);
            if (edge.end.equals(v)) list.insertLast(edge);
        }

        return list;
    }

    @Override
    public List<Vertex<V>> vertices() {
        LinkedList<Vertex<V>> list = new LinkedList<Vertex<V>>();
        for (EdgeListVertex vertex : vertices) {
            list.insertLast(vertex);
        }
        return list;
    }

    @Override
    public List<Edge<E>> edges() {
        LinkedList<Edge<E>> list = new LinkedList<Edge<E>>();
        for (EdgeListEdge edge : edges) {
            list.insertLast(edge);
        }
        return list;
    }

}
  

Есть какие-нибудь советы?

Комментарии:

1. В чем ваш конкретный вопрос?

2. похоже, что ваш фрагмент кода был усечен вверху. Если домашнее задание, пожалуйста, используйте тег «домашнее задание». Предположительно, у вас есть вопросы по поводу задействованного ввода-вывода, но сначала вам нужно показать, что вы пробовали.

3. @jzd Ок. Мой конкретный вопрос заключается в том, как начать или приблизиться к созданию графика. Я думаю использовать объект scanner, затем использовать что-то вроде объекта BufferedReader (не уверен, есть ли такой в JAVA API), затем использовать readLine (). После выполнения этого либо преобразуйте прочитанное значение в элемент объекта EdgeListEdge (или объекта EdgeListVertex). Я не очень хорош в синтаксисе Java, хотя и был бы признателен за любые подсказки..@ bkail Я не уверен, что такое ввод-вывод и какой фрагмент кода был усечен (синтаксис для создания вершины или начало класса)

Ответ №1:

Хорошим подходом может быть создание нового класса с полями для вершины, имени и координат. Затем считайте данные со сканера в ArrayList только что созданного вами класса. После этого вы могли бы просто передать ArrayList во все, что вы используете для построения графиков (что может потребовать нескольких настроек).

Пример кода сканера (непроверенный):

 File graphFile = new File(filepath);
Scanner graphScanner = new Scanner(graphFile);
  

Затем для чтения со сканера (непроверенный):

 ArrayList<graphClass> dataPoints = new ArrayList<graphClass>(); //you will have to make graphClass
while(graphScanner.hasNextLine()) {
    dataPoints.add(new graphClass(graphScanner.nextDouble(), graphScanner.next(), graphScanner.nextDouble(), graphScanner.nextDouble()); //assuming constructor of graphClass takes vertex, name, x, y in that order
  

Я надеюсь, что это поможет.