0

我有一个作者名单,上面有书名和出版年份,例如:

Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes、Doug Lea:Java 并发实践,2006

Ken Arnold、James Gosling 和 David Holmes:Java 编程语言,2005

...

我想知道哪种数据结构最适合存储关于合著者、他们一起写的书和出版年份的信息。

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

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

但也许这过于复杂了?

提前感谢您的帮助。

4

3 回答 3

2

将一组作者和标题放在一个对象中怎么样,例如,命名为“书”?这样,您的数据结构可以很简单

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 映射)并绘制所需的节点,然后在它们之间绘制一条边。

于 2011-10-31T10:44:15.957 回答
1

只需从中创建一个 JUNG 图;JUNG 将处理数据结构。也就是说,节点将是作者,边将是共同作者关系(由有关作品的信息组成)。

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

于 2011-10-31T16:05:28.317 回答
0

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

为什么不创建Class Book, 包含诸如出版年份、名称等内容。而不是创建另一个实体,例如Class Author, 并且在两个Book之间构造将包含List<Author>coAuthors ,并且Author可以包含List<Book>

于 2011-10-31T10:50:08.300 回答