哪个数据结构存储共同作者?

时间:2011-10-31 10:22:58

标签: java data-structures graph jung

我有一份作者列表,其中包含该书的标题和出版年份,例如:

Brian Goetz,Tim Peierls,Joshua Bloch,Joseph Bowbeer,David Holmes,Doug Lea:Java Concurrency in Practice,2006

Ken Arnold,James Gosling和David Holmes:Java Programming Language,2005

...

我想知道什么样的数据结构最适合存储有关共同作者的信息,他们一起写的书以及出版年份。

我想稍后使用这些信息绘制图形(在JUNG中,我正在使用java),其中每个作者都是节点,边缘将是他们共同撰写的每本书。每年都会绘制单独的图表。我在考虑使用multimap:

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

但也许这太复杂了?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

如何将一组作者和标题放在一个名为“Book”的对象中?这样,您的数据结构可能只是

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方法首先检查两个作者是否已经绘制了相应的节点(例如,使用包含已绘制节点的作者的集合,或者可能是作者=&gt;节点图)并绘制所需的节点,然后在它们之间划清界限。

答案 1 :(得分:1)

只需创建一个JUNG图形; JUNG将处理数据结构。也就是说,节点将是作者,边缘将是共同作者关系(其中包含有关工作的信息)。

也就是说,在过去使用过共同作者图表时,您可能希望将共同作者的更自然的表示视为二分图(作者与作品)或超图。这样您就不需要多次冗余地表示工作了。

答案 2 :(得分:0)

我认为这样构建数据是一个坏主意,为什么不使用多态概念呢?

为什么不创建Class Book,包含发布年份,名称等内容。 比创建Class Author之类的另一个实体,并在两个 Book 之间构建将包含List<Author> coAuthors,作者可以包含List<Book>