Java Class Design - Графики - PullRequest
       8

Java Class Design - Графики

2 голосов
/ 15 октября 2010

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

Назначениесвязанные с теорией графов, поэтому нас попросили создать интерфейсы для 2 типов графов, простых графов и мультиграфов (которые могут иметь параллельные ребра) и соответствующей реализации.

Я придумалследующая иерархия интерфейсов:

* Element
    - Vertex
    - Edge
        + MultiEdge
* Graph
    - MultiGraph

и их соответствующие реализации.Теперь я действительно не хочу обсуждать мою фактическую реализацию здесь, я просто привожу несколько примеров, с которыми у меня возникли проблемы из-за (по крайней мере, я так думаю) способа, которым я задумал в целом.

Все это работало довольно хорошо, пока мне не понадобилось расширить свой График, чтобы иметь функциональность MultiGraph.Вот фрагмент кода из GraphImpl:

protected final List edges;

public Graph addEdge(Edge e) {
    List newEdges = new ArrayList<Edge>();
    newEdges.addAll(edges);
    newEdges.add(e);
    return new GraphImpl(vertices, newEdges);
}

Как вы можете видеть, я сохраняю края графиков в List в моем GraphImpl, и поэтому у меня есть много таких списков по всей моей реализации.Кроме того, вы можете видеть, что я возвращаю новый GraphImpl из addEdge, так как GraphImpl должен быть неизменным.

При этом я столкнулся с большими проблемами при реализации MultiGraph, потому что здесь мне нужно было обменять список для списка .Но когда я переопределил переменную «edge» в MultiGraph, я думаю, что методы в GraphImpl все еще обращались к списку, который я определил в GraphImpl, так что ребра не добавлялись, если я вызывал MultiGraph, до тех пор, пока полностью не переписали его для MultiGraph.Но позже я заметил, что мне все равно пришлось бы переписать его, потому что addEdge в GraphImpl возвращает (естественно) GraphImpl, но в MultiGraphImpl мне нужно было бы создать MultiGraphImpl.

Что я естьпытаясь понять, как бы вы спроектировали и внедрили такую ​​вещь.У меня есть набор интерфейсов, расширяющих друг друга, и одна и та же иерархия реализаций, также расширяющих друг друга.

Функциональность Graph является лишь подмножеством MultiGraph, поэтому все, что делается в GraphImpl, этов основном также действует для MultiGraphImpl.Прямо сейчас мне нужно было скопировать много кода из GraphImpl в MultiGraphImpl, просто чтобы преодолеть проблемы с типами (которые я, по крайней мере, каким-то образом понимаю, но я не знаю, как их обойти).

НадеюсьВы не слишком смущены сейчас, потому что я определенно;) Если я был неясен в какой-либо части, я буду рад уточнить, просто укажите мне на то, что пропало.

Ответы [ 3 ]

1 голос
/ 15 октября 2010

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

Удачи!

1 голос
/ 15 октября 2010

Может быть, вам нужен Composite Pattern здесь. Это позволяет одинаково обрабатывать как одиночные, так и множественные объекты. Возможно, это поможет вашему дизайну.

0 голосов
/ 15 октября 2010

Это очень полная структура данных, разработанная Гудричем / Тамассия для книги «Структуры данных и алгоритмы на Java».

Дайте ему попробовать: http://net3.datastructures.net/

И, да, я поддерживаю мультиграф

...