создание ориентированного графа

#java #algorithm #graph

#java #алгоритм #График

Вопрос:

я хочу создать ориентированный график, у меня есть три переменные: строка x, y, z и первая вершина содержат 3 переменные, а следующая содержит следующие 3 до конца цикла

у меня есть это:

 BufferedReader reader = new BufferedReader(
    new StringReader(contentTextArea.getText()));

try {
  str =reader.readLine();

  while(str != null) {
    String splitted[] = str.split("\|");
    String x = splitted[0].trim();
    String y = splitted[1].trim();
    String z = splitted[2].trim();
  }          
}
  

итак, этот код выдает мне каждый раз 3 строки, и я хочу для каждого раза создавать вершину и ребро, и это создаст график в конце.
код мог бы быть таким, но я не знаю, что написать внутри
createVertex (String x,y,z) , addEdge () методы.

 public class graph {  
  createVertex (String x,y,z);
  addEdge ();
}
  

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

1. вам нужна реализация (структура данных и т.д.) Для хранения информации о графике. В зависимости от того, какие операции вам нужны для этого графика, вы должны выбрать правильную реализацию (структуру)

2. В дополнение к тому, что сказал Уинфред, я думаю, вам следует пересмотреть форму вашего ввода. Вы каждый раз создаете «вершину и ребро»? (1) Что вы будете делать при создании графа, который не имеет одинакового количества вершин и ребер? (2) В самой первой строке укажите, к каким двум вершинам должно присоединиться ваше ребро? — О, и подписи ваших createVertex и addEdge для меня не имеют особого смысла. Три строки для createVertex ? Для чего они нужны? Нет аргументов для addEdge ? Тогда какое ребро ему следует добавить?

3. Я думаю, первое, что нам (и вам) нужно знать: для чего это нужно? Зачем вы это делаете? Чего вы надеетесь достичь?

4. Вы также должны указать, какую библиотеку вы используете.

5. Если вы хотите реализовать свой собственный, вам нужно знать, какие функции / операции вы хотите иметь для своего графика: т. Е. Минимальное расстояние, средняя пропускная способность, checkforcyclic и т.д.?. Например, jgrapht.sourceforge.net это библиотека графов на Java, готовая к использованию.

Ответ №1:

Если вы хотите создать linestrip, т. е. каждая строка представляет вершину, а ребро образовано двумя последовательными вершинами, вы могли бы создать / использовать Vertex класс, представляющий вершину, и Edge класс, который имеет ссылку на 2 вершины, которые образуют его конечные точки.

В вашем классе graph вы могли бы тогда просто иметь список вершин и список ребер. createVertex() затем можно было бы просто добавить новую вершину в список, тогда как addEdge() можно было бы создать ребро, используя последние две вершины в списке (если их хотя бы две!), и поместить ребро в список ребер.

Если у вас позже появятся ребра, образованные определенными вершинами (т. Е. Не двумя последними), вы можете использовать индекс каждой вершины в списке, чтобы ссылаться на них и определять ребро через эти индексы (т. Е. ребро от вершины 0 до 5 может быть определено как 0,5 ).

Ответ №2:

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

Двумя распространенными представлениями являются матрицы связности и списки смежности. Любое представление может сработать для вас.

Создать новую вершину легко, просто вызовите addVertex на графике JGraph. Это вернет объект vertex. Вам нужно будет предоставить ему два параметра, имя и объект данных. В качестве имени используйте либо увеличивающийся идентификационный номер, либо исходную строку line. Затем вам нужно будет создать объект данных из трех строк, предоставление пользовательского объекта данных имеет наибольший смысл для меня.

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

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

1. addEdge находится между двумя последовательными вершинами