Какую структуру данных хранить в соавторстве? - PullRequest
0 голосов
/ 31 октября 2011

У меня есть список авторов с названием книги и годом публикации, например:

Брайан Гетц, Тим Пайерлс, Джошуа Блох, Джозеф Боубер, Дэвид Холмс, Дуг Ли:Java Concurrency in Practice, 2006

Кен Арнольд, Джеймс Гослинг и Дэвид Холмс: Язык программирования Java, 2005

...

Мне было интересно, что такое структура данныхбыло бы лучше хранить информацию о соавторах, книгу, которую они написали вместе, и год публикации.

Я хотел бы позже использовать эту информацию для рисования графиков (в JUNG , I 'м, используя java), где каждый автор будет узлом, а край - каждой книгой, которую они в соавторстве.Отдельный график будет составлен для каждого года.Я думал об использовании multimap:

Map<Year, Map<Author, List<Map<Co-author, Title>>>>

, но, может быть, это слишком сложно?

Заранее спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 31 октября 2011

Как насчет размещения набора авторов и заголовка в объекте, названном, например, «Книга»?Таким образом, ваши структуры данных могут быть просто

class Book {
    List<Author> authors;
    Title title;
}

Map<Year, Set<Book>> booksInYears

Алгоритм рисования графика может работать следующим образом:

for (Book book : booksInYears.get(aYear)) 
    for (Author author1 : book.authors) 
        for (Author author2 : book.authors) 
            if (author1 != author2) 
                drawEdge(author1, author2, book.title);

drawEdge метод сначала проверит, есть ли у обоих авторов соответствующие узлыуже нарисованы (например, используя набор, содержащий авторов с уже нарисованными узлами, или, возможно, карту Author => Node) и нарисуйте необходимые узлы, а затем проведите грань между ними.

1 голос
/ 31 октября 2011

Просто создайте граф JUNG из него;JUNG будет обрабатывать структуры данных.То есть узлами будут «Авторы», а ребрами будут отношения «Соавтор» (которые будут состоять из информации о работе).

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

0 голосов
/ 31 октября 2011

Думаю, это плохая идея структурировать ваши данные таким образом, почему бы не использовать концепцию полиморфизма?

Почему бы не создать Class Book, содержащий такие вещи, как год публикации, имя и т. Д.другая сущность, такая как Class Author, и конструкция между двумя Book будет содержать List<Author> coAuthors, а Author может содержать List<Book>

...