В какой структуре данных хранить соавторство?

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

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

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

...

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

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

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

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

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


person user1021750    schedule 31.10.2011    source источник


Ответы (3)


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

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), и рисует необходимые узлы, а затем рисует границу между ними.

person socha23    schedule 31.10.2011

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

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

person Joshua O'Madadhain    schedule 31.10.2011

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

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

person Pavel 'PK' Kaminsky    schedule 31.10.2011