2016-10-20 3 views
0

Я пытаюсь сделать граф, который читает txt-файл и помещает слова в график, но он не может повторить (в случае, если два одинаковых слова в файл)Различные текстовые слова в графике (с JUNG lib)

вот мой код (ИСПОЛЬЗОВАНИЕ JUNG API)

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Scanner; 
import java.util.Stack; 
import edu.uci.ics.jung.graph.DirectedSparseGraph; 
import edu.uci.ics.jung.graph.Graph; 
import edu.uci.ics.jung.graph.SparseMultigraph; 
import edu.uci.ics.jung.graph.util.EdgeType; 


public class Main { 

    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 
     Scanner scan = null; 
/*i have a class named 'Palavra' that returns me a string(did that cause // i'll use the class to implement some things at the word) */ 

     Stack<Palavra> palavras = new Stack<Palavra>(); // pilha para delimitar 
                 // tamanho do grafo 

     // Read txt 
     try { 
      scan = new Scanner(new File("C:\\Users\\Auryon.AURYON-PC\\Desktop\\Aula1\\teste.txt")); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 


     /*int i = 0;*/ 
     Graph<Palavra, Relacao> g = new SparseMultigraph<Palavra, Relacao>(); 

// последний класс, который я создал (будет мое слово проверка отношения)

 Relacao tipo_palavra = new Relacao("connect"); 

# зДЕСЬ ПРОБЛЕМА

 while (scan.hasNextLine()) { 
      String s = scan.next(); 
      Palavra word = new Palavra(s); 
      if (palavras.contains(word)) { 
       s = scan.next(); 
      } else { 
       palavras.push(word); 
       g.addVertex(word); 
      } 
      /* 
      * if (i > 0) { g.addEdge(tipo_palavra,word,palavras.lastElement()); 
      * //multiple edges } 
       */ 
      } 

      System.out.println(g); 


    System.out.println(palavras.size()); 

     } 
    } 

MY NEW UPDATE

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Scanner; 
import java.util.Stack; 
import edu.uci.ics.jung.graph.DirectedSparseGraph; 
import edu.uci.ics.jung.graph.Graph; 
import edu.uci.ics.jung.graph.SparseMultigraph; 
import edu.uci.ics.jung.graph.util.EdgeType; 

public class Main { 

    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 
     Scanner scan = null; 

     Stack<Palavra> palavras = new Stack<Palavra>(); // Graph Size Stack 


     // Read txt 
     try { 
      scan = new Scanner(new File("C:\\Users\\Auryon.AURYON-PC\\Desktop\\Aula1\\teste.txt")); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 



     Graph<Palavra, Relacao> g = new SparseMultigraph<Palavra, Relacao>(); 

     Relacao tipo_palavra = new Relacao("connect"); 

     String s = scan.next(); 
     Palavra word = new Palavra(s); 
     palavras.push(word); 
     g.addVertex(word); 

     while (scan.hasNextLine()) { 
      s = scan.next(); 
      word = new Palavra(s); 
      //THE REAL PROBLEM 
      g.addVertex(word); 
      g.addEdge(tipo_palavra, word, palavras.lastElement()); 
      palavras.push(word); 



     } 
     System.out.println(g); 
     System.out.println(palavras.size()); 

    } 
} 
+0

Что вы имеете в виду «но он не может повторить (в том случае, имея двух одинаковых слов в файле)»? Вы имеете в виду, что вы не можете иметь те же два слова на графике, что означает, что каждое слово в графе уникально? – DivDiff

+0

ну, я просто пытаюсь сделать граф, который соединяет слова thoose с txt-файлом, но я принимал проблемы с добавлением ребра, потому что появляется сообщение о том, что я не могу повторить одни и те же граничные конечные точки, поэтому я подумал, что должен фильтровать мои вершины графа, я сделал себя достаточно ясно? – Aury0n

+0

Я только что опубликовал обновление на пост, (я не знаю, сделал ли я это, используя лучшие методы StackOverflows, но, есть), теперь я работаю в проекте и рад, если вы могли бы помочь ... я опубликую обновления – Aury0n

ответ

0

здесь ответ, а также мои графики работы полная:

import java.io.FileNotFoundException; 
import java.awt.Dimension; 
import java.io.File; 
import java.io.IOException; 
import java.util.Collection; 
import java.util.HashMap; 
import java.util.Scanner; 
import java.util.Stack; 

import javax.swing.JFrame; 

import edu.uci.ics.jung.algorithms.layout.TreeLayout; 
import edu.uci.ics.jung.algorithms.layout.CircleLayout; 
import edu.uci.ics.jung.algorithms.layout.Layout; 
import edu.uci.ics.jung.algorithms.layout.PolarPoint; 
import edu.uci.ics.jung.graph.DirectedSparseGraph; 
import edu.uci.ics.jung.graph.Graph; 
import edu.uci.ics.jung.graph.SparseMultigraph; 
import edu.uci.ics.jung.graph.util.EdgeType; 
import edu.uci.ics.jung.visualization.BasicVisualizationServer; 
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller; 

public class Main { 

    /** 
    * 
    * @param args 
    * @throws IOException 
    * 
    */ 

    // BEGIN DEEP SEARCH 

    Stack<Word> pilha; 

    public void buscaProfundidade(Graph<Word, Relacao> g1, Word n0) { 
     HashMap<Integer, Word> visitados = new HashMap<Integer, Word>(); 
     pilha = new Stack<Word>(); 
     pilha.add(n0); 
     while (!pilha.isEmpty()) { 
      Word n = pilha.pop(); 
      marcarVisitado(n, visitados); 
      processarNo(n); // print 
      Collection<Word> adjacencias = g1.getNeighbors(n); // coleção dos 
                   // adjacentes do nó 
                   // atual 
      for (Word adjacente : adjacencias) { 
       if (!foiVisitado(adjacente, visitados)) { 
        pilha.push(adjacente); 
       } 
      } 
     } 
     // RENDERIZA GRAFO 
     Layout<Word, Relacao> layout = new CircleLayout<Word, Relacao>(g1); 
     layout.setSize(new Dimension(800, 600)); // sets the initial size of the 
                // space 
     // The BasicVisualizationServer<V,E> is parameterized by the edge types 
     BasicVisualizationServer<Word, Relacao> vv = new BasicVisualizationServer<Word, Relacao>(layout); 

     vv.setPreferredSize(new Dimension(800, 600)); // Sets the viewing area 
                 // size 
     vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller()); 
     vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller()); 
     vv.getRenderContext().setLabelOffset(20); 

     JFrame frame = new JFrame("WORD INDICATOR"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(vv); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void processarNo(Word n) { 
     System.out.println(n); 

    } 

    boolean foiVisitado(Word adjacente, HashMap<Integer, Word> visitados) { 

     return visitados.containsKey(adjacente.getId()); 

    } 

    private void marcarVisitado(Word n, HashMap<Integer, Word> visitados) { 
     visitados.put(n.getId(), n); 

    } 

    // DEEP SEARCH END 
    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 

     Scanner scan = null; 

     Stack<Word> words = new Stack<Word>(); 
     // CRIA GRAFO 
     // Read txt 

     try { 
      scan = new Scanner(
        new File("C:\\Users\\Auryon.AURYON-PC\\Documents\\GitHub\\java-works\\Graphs_JUNG\\teste.txt")); 

      // scan = new Scanner(new 
      // File("C:\\Users\\Auryon.AURYON-PC\\Desktop\\flatWiki.txt")); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

     Graph<Word, Relacao> g = new SparseMultigraph<Word, Relacao>(); 
     int i = 1; 
     Relacao word_type = new Relacao("connect"); 
     String s = scan.next(); 
     Word word = new Word(i, s, s, s, s); 
     words.push(word); 
     g.addVertex(word); 

     while (scan.hasNextLine()) { 
      i++; 
      s = scan.next(); // TODO:implementar classes separadas 
      /* 
      * s2 s3 s4 
      */ 
      word = new Word(i, s, s, s, s); 
      g.addVertex(word); 
      try { 
       word_type = new Relacao(""); 
       g.addEdge(word_type, words.lastElement(), word, EdgeType.DIRECTED); 
       words.push(word); 

      } catch (Exception e) { 

      } 
      ; 

      System.out.println(g); 
      System.out.println(words.size()); 
     } 

     Main busca = new Main(); 
     Collection<Word> vertices = g.getVertices(); 
     Word p = vertices.iterator().next(); // parametro busca 
     busca.buscaProfundidade(g, p); 

     // TERMINA GRAFO 

    } 

} 
1

Как сказал @DivDiff, это не совсем понятно, в чем ваша проблема, но это звучит, как вы ожидали что количество слов во входном файле будет таким же, как количество вершин в созданном вами графе (в котором вершины ar e слова).

Короткий вариант: это будет верно, если слова в файле появляются только один раз. Если word уже не в графике, и вы делаете это:

boolean result1 = g.addVertex(word); 
boolean result2 = g.addVertex(word); 

тогда result1 будет true (график был изменен) и result2 будет false (график не был изменен), как указано в документации для addVertex.

Это ограничение - то, что вершины должны быть уникальными - позволяет использовать вершины в качестве ключей к внутренним структурам данных Графа и, что более важно, в качестве аргументов для методов, таких как getNeighbors().

UPDATE: ваш комментарий ниже показывает, что фактическая проблема, которую вы видите, заключается в том, что вы пытаетесь добавить один и тот же край с разными конечными точками.

В частности, у вас есть один краевой объект (tipo_palavra), и вы неоднократно добавляете этот край к графику с различными конечными точками. Это не сработает: каждый объект края должен быть уникальным.

Если сам край не имеет никакого значения для вас, кроме как средство соединения двух вершин, то у вас есть два основных варианта:

(1) Создание нового объекта края для каждой пары конечных точек , например, у края быть целым и просто увеличивать его каждый раз:

g.addEdge(i++, word1, word2); 

(2) Используйте другую библиотеку, чтобы представить свой график, который не требует, чтобы у вас есть явные краевые объекты, например, Guava's common.graph library (доступно в версии 20 RC1), в частности, типа Graph.

+0

как я сказал @DivDiff, я просто пытаюсь сделать граф, который соединяет эти слова с txt-файлом, но я принимал проблемы с добавлением ребра, потому что появляется ошибка messge, говорящая, что _italic _ ** edge connect уже существует в этом графе с endpoints **, я думал, что я должен фильтровать свой график только с разными словами в txt-файле, может быть, мне нужно больше теории, если вы, ребята, могли бы мне помочь, я был бы очень благодарен. – Aury0n

+0

Я только что опубликовал обновление в сообщении, показывая лучшую проблему. Мне действительно нужна рука здесь, рад, если вы могли бы помочь. – Aury0n

+0

@ Aury0n: Я обновил ответ, чтобы отразить ошибку, на которую вы ссылались. Это сказало: я еще раз посмотрел, что делает ваш код на самом деле, и на самом деле вы не строите график вообще, насколько я могу судить. Опять же, я не могу видеть ваш вход, но вы читаете слова и соединяете каждое слово с предыдущим словом. Это не так много графика, как связанный список. В чем проблема, которую вы пытаетесь решить? –

 Смежные вопросы

  • Нет связанных вопросов^_^